在一个片段中检测Recyclerview的上下滑动,我怎么做?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在一个片段中检测Recyclerview的上下滑动,我怎么做?相关的知识,希望对你有一定的参考价值。

我有一个加载了Firebase Firestore文档的Recyclerview,我想看看它是向上还是向下滑动。根据方向的不同,我想让adapter.startListening();再来一次,如果他向下滑动就停止。我还想在用户向下滑动时隐藏一个按钮。我只是想知道如何才能看到他是否会这样做?

这段代码在左和右的情况下可以使用,但由于某些原因,在上和下的情况下就不行了?


        new ItemTouchHelper( new ItemTouchHelper.SimpleCallback(0,
                ItemTouchHelper.UP | ItemTouchHelper.DOWN) {
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
                return false;
            }

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
                if(direction == ItemTouchHelper.UP){
                    Toast.makeText(getActivity(), "You swiped up", Toast.LENGTH_LONG).show();
                }
            }
        });

这里是完整的代码,如果它的某些原因干扰的东西不知道。

public class HomeFragment extends Fragment {

    View myFragment;
    private ImageButton postButton;
    CollectionReference postsRef;
    FirebaseFirestore db;
    private PostsAdapter adapter;
    FirebaseAuth mAuth;
    RecyclerView recyclerView;

    public static ProfileFragment getInstance() {
        return new ProfileFragment();
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        myFragment = inflater.inflate(R.layout.fragment_home, container, false);
        postButton = myFragment.findViewById( R.id.postButton);
        recyclerView = myFragment.findViewById(R.id.postlist);
        mAuth = FirebaseAuth.getInstance();
        db = FirebaseFirestore.getInstance();
        postsRef = db.collection("posts");
        SetupRecyclerView();
        postButton.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SendUserToPostActivity();
            }
        });



        new ItemTouchHelper( new ItemTouchHelper.SimpleCallback(0,
                ItemTouchHelper.UP | ItemTouchHelper.DOWN) {
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
                return false;
            }

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
                if(direction == ItemTouchHelper.UP){
                    Toast.makeText(getActivity(), "You swiped up", Toast.LENGTH_LONG).show();
                }
            }
        });

        adapter.setOnConfirmClickListener( new PostsAdapter.onConfirmClickListener() {
            @Override
            public void onConfirmClick(DocumentSnapshot documentSnapshot, int position) {
                Posts post = documentSnapshot.toObject(Posts.class);
                String id = documentSnapshot.getId();
                if(post.getUid().equals(mAuth.getCurrentUser().getUid())){
                    adapter.deleteItem(position);
                    Toast.makeText(getActivity(), "Post deleted", Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(getActivity(), "You cannot delete this", Toast.LENGTH_LONG).show();
                }
            }
        });
        return myFragment;
    }

    @Override
    public void onStart(){
        super.onStart();
        adapter.startListening();
    }

    @Override
    public void onStop() {
        super.onStop();
        adapter.stopListening();
    }

    private void SetupRecyclerView() {
        Query query = postsRef.orderBy("time", Query.Direction.DESCENDING);
        FirestoreRecyclerOptions<Posts> options = new FirestoreRecyclerOptions.Builder<Posts>().setQuery(query, Posts.class).build();
        adapter = new PostsAdapter(options);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        recyclerView.setAdapter(adapter);
    }


    private void SendUserToPostActivity() {
        Intent postIntent = new Intent(getActivity(), PostActivity.class);
        startActivity(postIntent);
    }
}
答案

你用错了监听器。一个 ItemTouchHelper 适用于回收视图中的单个项目,而不是整个视图。

你要找的是 OnScrollListener:

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                //This is where you can track a scroll change
            }
        });

dy 中:在 onScrolled 方法指的是滚动事件中y位置的变化,同样对于 dx.

在该方法中,假设你想检查回收视图是否达到了向上或向下滚动的极限,那么在该方法中 onScroll 方法(或任何你正在检查的地方),你可以添加一个对 recyclerView.canScrollVertically(int). 该 int 值为-1表示向上,1表示向下,0表示FALSE,即不能滚动。

检查recyclerview是否到达底部。

if(!recyclerView.canScrollVertically(1)){
    //The recyclerview can no longer scroll downwards, you have reached the bottom
}

编辑添加: 你的 itemTouchHelper 也没有正常工作,因为垂直方向要在回调的第一个参数中指定,而水平方向要在第二个参数中指定。你为第一个参数传递了0,所以它没有将垂直方向作为一个选项。

以上是关于在一个片段中检测Recyclerview的上下滑动,我怎么做?的主要内容,如果未能解决你的问题,请参考以下文章

RecyclerView 滑动检测 (上滑 up)(下滑 down)(顶部 top)(底部 bottom)

RecycleViewScrollHelper--RecyclerView滑动事件检测的辅助类

RecyclerView 使用下面的视图滑动未检测到点击

在 TabLayout 中的片段之间滑动变慢

android RecyclerView四种滑动方式

RecyclerView 可以与其余的片段布局一起滚动吗?