【问题标题】:How to show Snackbar on scrolling up and dismiss on scrolling down in Recyclerview如何在 Recyclerview 中向上滚动和向下滚动时显示 Snackbar
【发布时间】:2018-07-08 04:29:04
【问题描述】:

我正在尝试实现一个 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");

            }
        }

    });

我认为问题可能在于,我现在并不想放弃正确的小吃店。 知道如何克服这个问题。

【问题讨论】:

  • 为什么你不在 else 中使用snackbar.show()
  • 我放在那里只是为了检查我向上滚动时关闭是否有效。
  • 但是您的代码看起来不错,您只需在 else 中添加 snackbar.show 即可使其可见。

标签: android android-recyclerview material-design android-snackbar snackbar


【解决方案1】:

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

  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();
            }
        }
    });
}

注意: canScrollVertically(int direction) direction int:否定检查向上滚动,肯定检查向下滚动。见文档here

【讨论】:

  • 你能解释一下这段代码到底在做什么吗?
  • 我应该在 .addOnScrollListener 内部还是外部初始化快餐栏。 snackbar = Snackbar.make(activity, "Add new friend", Snackbar.LENGTH_INDEFINITE);
  • 在您的情况下,您使用了协调器布局吗?另外我刚刚发现使用您的方法也不起作用。
  • 是的,我正在使用 coordinatorLayout。它就像一个魅力。你使用 CoordinaorLayout 吗?
  • 是的,我刚刚给了它来自 Coordinatior Layout 的 id 并按照我的意愿工作,非常感谢。我已经批准了这个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 2023-01-17
  • 2015-07-17
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
相关资源
最近更新 更多