按钮不会随 setVisibility(View.GONE) 消失
Button not disappearing with setVisibility(View.GONE)
我在 RecyclerView
上向上滚动时显示转到顶部按钮。如果用户向上滚动,则会显示该按钮。
这是嵌套在 RelativeLayout
中的 xml 代码。
<android.support.v7.widget.RecyclerView
android:id="@+id/userFeedsRecyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_goto_top"
android:layout_width="30dp"
android:layout_height="30dp"
android:text="@string/icon_up_arrow"
android:layout_alignParentBottom="true"
android:layout_marginBottom="20dp"
android:visibility="gone"
android:textSize="10sp"
android:layout_centerHorizontal="true"
android:background="@drawable/round_button"/>
这是java代码
btnGotoTop = (Button) findViewById(R.id.btn_goto_top);
Const.setTypeFace(btnGotoTop, getApplication());
btnGotoTop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
userFeedsRecyclerView.smoothScrollToPosition(0);
view.setVisibility(View.GONE);
}
});
userFeedsRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if(dy < 0){
btnGotoTop.setVisibility(View.VISIBLE);
}
else{
btnGotoTop.setVisibility(View.GONE);
}
}
});
在 btnGotoTop
的 onClick()
方法中,RecyclerView
正确滚动到顶部但按钮没有消失。
我尝试将 view.setVisibility(View.GONE)
更改为 btnGotoTop.setVisibility(View.GONE)
,但即使在滚动完成后仍会显示该按钮。
你的条件不对。您正在使按钮在滚动时可见,但您只想在它按下时显示。
改变这个
if(dy < 0){
btnGotoTop.setVisibility(View.VISIBLE);
}
else{
btnGotoTop.setVisibility(View.GONE);
}
到
if(dy > 0){
btnGotoTop.setVisibility(View.VISIBLE);
}
else{
btnGotoTop.setVisibility(View.GONE);
}
试试这个,我也推荐你在这里使用浮动操作按钮。我创建了一个简单的项目,以防您想使用具有相同功能的 FloatingActionButton 查找 recylerView。 Link.
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy > 0 && btnGotoTop.getVisibility() == View.VISIBLE)
{
btnGotoTop.hide();
} else if (dy < 0 && btnGotoTop.getVisibility() != View.VISIBLE)
{
btnGotoTop.show();
}
}
});
private boolean IsRecyclerViewAtTop(){
if (userFeedsRecyclerView.getChildCount() == 0)
return true;
return userFeedsRecyclerView.getChildAt(0).getTop() == 0;
}
userFeedsRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (IsRecyclerViewAtTop())
{
btnGotoTop.setVisibility(View.GONE);
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy < 0 && btnGotoTop.getVisibility()==View.GONE) {
btnGotoTop.setVisibility(View.VISIBLE);
} else if (dy > 0 && btnGotoTop.getVisibility()==View.VISIBLE){
btnGotoTop.setVisibility(View.GONE);
}
}
});
使用IsRecyclerViewAtTop
方法判断回收器视图是否滚动到顶部并调用它是onScrollStateChanged
方法。
我是这样解决的。更改了 RecyclerView 的 OnScrollListener
的 onScrollStateChanged() 中按钮的可见性
btnGotoTop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
userFeedsRecyclerView.smoothScrollToPosition(0);
view.setVisibility(View.GONE);
headerAppBarLayout.setExpanded(true);
}
});
private boolean isUserFeedRecyclerViewAtTop(){
int numColumns = 2;
int pos[] = new int[numColumns];
((StaggeredGridLayoutManager)(userFeedsRecyclerView.getLayoutManager())).findFirstCompletelyVisibleItemPositions(pos);
return pos[0] == 0;
}
userFeedsRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
switch (newState){
case RecyclerView.SCROLL_STATE_IDLE:
if(isUserFeedRecyclerViewAtTop()) {
btnGotoTop.setVisibility(View.GONE);
}
break;
case RecyclerView.SCROLL_STATE_DRAGGING:
break;
case RecyclerView.SCROLL_STATE_SETTLING:
break;
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if(dy < 0 && btnGotoTop.getVisibility() == View.GONE){
btnGotoTop.setVisibility(View.VISIBLE);
}
else if (dy > 0 && btnGotoTop.getVisibility() == View.VISIBLE){
btnGotoTop.setVisibility(View.GONE);
}
}
});
我在 RecyclerView
上向上滚动时显示转到顶部按钮。如果用户向上滚动,则会显示该按钮。
这是嵌套在 RelativeLayout
中的 xml 代码。
<android.support.v7.widget.RecyclerView
android:id="@+id/userFeedsRecyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_goto_top"
android:layout_width="30dp"
android:layout_height="30dp"
android:text="@string/icon_up_arrow"
android:layout_alignParentBottom="true"
android:layout_marginBottom="20dp"
android:visibility="gone"
android:textSize="10sp"
android:layout_centerHorizontal="true"
android:background="@drawable/round_button"/>
这是java代码
btnGotoTop = (Button) findViewById(R.id.btn_goto_top);
Const.setTypeFace(btnGotoTop, getApplication());
btnGotoTop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
userFeedsRecyclerView.smoothScrollToPosition(0);
view.setVisibility(View.GONE);
}
});
userFeedsRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if(dy < 0){
btnGotoTop.setVisibility(View.VISIBLE);
}
else{
btnGotoTop.setVisibility(View.GONE);
}
}
});
在 btnGotoTop
的 onClick()
方法中,RecyclerView
正确滚动到顶部但按钮没有消失。
我尝试将 view.setVisibility(View.GONE)
更改为 btnGotoTop.setVisibility(View.GONE)
,但即使在滚动完成后仍会显示该按钮。
你的条件不对。您正在使按钮在滚动时可见,但您只想在它按下时显示。 改变这个
if(dy < 0){
btnGotoTop.setVisibility(View.VISIBLE);
}
else{
btnGotoTop.setVisibility(View.GONE);
}
到
if(dy > 0){
btnGotoTop.setVisibility(View.VISIBLE);
}
else{
btnGotoTop.setVisibility(View.GONE);
}
试试这个,我也推荐你在这里使用浮动操作按钮。我创建了一个简单的项目,以防您想使用具有相同功能的 FloatingActionButton 查找 recylerView。 Link.
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy > 0 && btnGotoTop.getVisibility() == View.VISIBLE)
{
btnGotoTop.hide();
} else if (dy < 0 && btnGotoTop.getVisibility() != View.VISIBLE)
{
btnGotoTop.show();
}
}
});
private boolean IsRecyclerViewAtTop(){
if (userFeedsRecyclerView.getChildCount() == 0)
return true;
return userFeedsRecyclerView.getChildAt(0).getTop() == 0;
}
userFeedsRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (IsRecyclerViewAtTop())
{
btnGotoTop.setVisibility(View.GONE);
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy < 0 && btnGotoTop.getVisibility()==View.GONE) {
btnGotoTop.setVisibility(View.VISIBLE);
} else if (dy > 0 && btnGotoTop.getVisibility()==View.VISIBLE){
btnGotoTop.setVisibility(View.GONE);
}
}
});
使用IsRecyclerViewAtTop
方法判断回收器视图是否滚动到顶部并调用它是onScrollStateChanged
方法。
我是这样解决的。更改了 RecyclerView 的 OnScrollListener
的 onScrollStateChanged() 中按钮的可见性btnGotoTop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
userFeedsRecyclerView.smoothScrollToPosition(0);
view.setVisibility(View.GONE);
headerAppBarLayout.setExpanded(true);
}
});
private boolean isUserFeedRecyclerViewAtTop(){
int numColumns = 2;
int pos[] = new int[numColumns];
((StaggeredGridLayoutManager)(userFeedsRecyclerView.getLayoutManager())).findFirstCompletelyVisibleItemPositions(pos);
return pos[0] == 0;
}
userFeedsRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
switch (newState){
case RecyclerView.SCROLL_STATE_IDLE:
if(isUserFeedRecyclerViewAtTop()) {
btnGotoTop.setVisibility(View.GONE);
}
break;
case RecyclerView.SCROLL_STATE_DRAGGING:
break;
case RecyclerView.SCROLL_STATE_SETTLING:
break;
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if(dy < 0 && btnGotoTop.getVisibility() == View.GONE){
btnGotoTop.setVisibility(View.VISIBLE);
}
else if (dy > 0 && btnGotoTop.getVisibility() == View.VISIBLE){
btnGotoTop.setVisibility(View.GONE);
}
}
});