簡體   English   中英

檢測片段中 Recyclerview 上的上下滑動我該怎么做?

[英]Detecting up and down swipes on a Recyclerview in a fragment how can I do that?

所以我有一個加載了 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();
                }
            }
        });

這里是完整的代碼,如果它出於某種原因干擾了 smth 不知道

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適用於 recyclerview 中的單個項目,而不是整個視圖。

您正在尋找的是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
            }
        });

onScrolled方法中的dy指的是滾動事件中 y position 的變化,對於dx也是如此。

在該方法中,假設您想檢查 recyclerview 是否達到向上或向下滾動的限制,然后在該onScroll方法(或您正在檢查的任何地方)中,您可以添加對recyclerView.canScrollVertically(int)的調用. int的值為 -1 表示 UP,1 表示 DOWN,0 表示 FALSE,即不能滾動。

檢查recyclerview是否到達底部:

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

編輯添加:您的itemTouchHelper也無法正常工作,因為要在回調的第一個參數中指定垂直方向,而在第二個參數中指定水平方向。 您為第一個參數傳遞了 0,因此它認為沒有垂直方向作為選項

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM