Android 如何在Recyclerview中向上滚动时显示Snackbar,向下滚动时显示Disclose

Android 如何在Recyclerview中向上滚动时显示Snackbar,向下滚动时显示Disclose,android,android-recyclerview,material-design,android-snackbar,snackbar,Android,Android Recyclerview,Material Design,Android Snackbar,Snackbar,我正在尝试实现一个Snackbar,当用户在RecyclerView上滚动时,它会显示并关闭。这是视图的.xml文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_heigh

我正在尝试实现一个Snackbar,当用户在RecyclerView上滚动时,它会显示并关闭。这是视图的.xml文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/activityFriendsList">

    <android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/friendsRecyclerView"/>

    </android.support.design.widget.CoordinatorLayout>
</RelativeLayout>

这也是应该做这项工作的函数

Snackbar snackbar;


 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            snackbar = Snackbar.make(activity, "Add new friend", Snackbar.LENGTH_INDEFINITE);
            snackbar.show();
            if (dy > 0) {
                Log.i("Info", "Scrolling up");
                if(snackBarIsShowing) {
                    snackBarIsShowing = false;
                }
            }
            if (dy < 0){
                Log.i("Info", "Scrolling down");
                if(!snackBarIsShowing) {
                    snackBarIsShowing = true;
                }
            }

            if (snackBarIsShowing) {
                Log.i("Info", "Create new");
                snackbar.dismiss();
            } else {
                Log.i("Info", "Dismiss the old one");

            }
        }

    });
Snackbar Snackbar;
recyclerView.addOnScrollListener(新的recyclerView.OnScrollListener(){
@凌驾
已填空的公共空间(RecyclerView RecyclerView、int dx、int dy){
super.onScrolled(recyclerView、dx、dy);
snackbar=snackbar.make(活动“添加新朋友”,snackbar.LENGTH\u不确定);
snackbar.show();
如果(dy>0){
Log.i(“信息”,“向上滚动”);
if(快餐店展示){
snackBarIsShowing=错误;
}
}
if(dy<0){
Log.i(“信息”,“向下滚动”);
如果(!snackBarIsShowing){
snackBarIsShowing=真;
}
}
if(快餐店展示){
Log.i(“信息”,“创建新”);
snackbar.disclose();
}否则{
Log.i(“信息”,“撤销旧文件”);
}
}
});
我认为问题可能是,现在我并不是要解雇一家合适的快餐店。
你知道我怎样才能克服这个问题吗

试试这个,我已经测试过了,它工作正常

  RecyclerAdapter adapter;
RecyclerView recyclerView;
private Snackbar snackbar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    snackbar = Snackbar.make(findViewById(android.R.id.content), "should disappear when scrolling!", Snackbar.LENGTH_LONG);
    recyclerView = findViewById(R.id.recyclerView);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
    adapter = new RecyclerAdapter(myList);
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setAdapter(adapter);

    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public final void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            if (!recyclerView.canScrollVertically(-1)) {

                if (!snackbar.isShown())
                    snackbar.show();

            } else if (!recyclerView.canScrollVertically(1)) {
                if (snackbar.isShown())
                    snackbar.dismiss();
            }
            if (dy < 0) {
                if (!snackbar.isShown())
                    snackbar.show();
            } else if (dy > 0) {
                if (snackbar.isShown())
                    snackbar.dismiss();
            }
        }
    });
}
RecyclerAdapter适配器;
回收视图回收视图;
私人快餐店;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
snackbar=snackbar.make(findviewbyd(android.R.id.content),“滚动时应该消失!”,snackbar.LENGTH\u LONG);
recyclerView=findViewById(R.id.recyclerView);
RecyclerView.LayoutManager LayoutManager=新的LinearLayoutManager(此);
适配器=新的回收适配器(myList);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(适配器);
recyclerView.addOnScrollListener(新的recyclerView.OnScrollListener(){
@凌驾
已填制的公共最终作废(RecyclerView RecyclerView、int dx、int dy){
如果(!recyclerView.CanScrollVertical(-1)){
如果(!snackbar.isShown())
snackbar.show();
}如果(!recyclerView.CanScrollVertical(1)){
if(snackbar.isShown())
snackbar.disclose();
}
if(dy<0){
如果(!snackbar.isShown())
snackbar.show();
}如果(dy>0),则为else{
if(snackbar.isShown())
snackbar.disclose();
}
}
});
}
注意:
可以垂直滚动(int方向)

direction
int:负数表示向上滚动,正数表示向下滚动。请参阅文档

为什么不在else中使用
snackbar.show()
?我的位置仅用于在向上滚动时检查Disclose是否有效。但您的代码看起来很好,您只需在else中添加
snackbar.show
,即可使其可见。您能解释一下此代码到底在做什么吗?我应该在.addOnScrollListener内部或外部的何处初始化snackbar
snackbar=snackbar.make(活动“添加新朋友”,snackbar.LENGTH\u不确定)在您的案例中,是否使用了协调器布局?另外,我刚刚发现使用你的方法也不起作用。是的,我正在使用coordinatorLayout。它工作起来很有魅力。你使用CoordinaorLayout吗?是的,我刚从CoordinatorLayout中给了它id,并按我想要的方式工作。谢谢。我已经同意了这个答案。