您的当前位置:首页正文

RecyclerView细节功能实现记录

2024-11-24 来源:个人技术集锦
  • 监控滑动

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                //newState为滑动状态,可利用该属性减少方法的频繁重复调用
                //SCROLL_STATE_IDLE        静止没有滚动
                //SCROLL_STATE_DRAGGING    正在被拖拽
                //SCROLL_STATE_SETTLING    自动滚动,惯性滚动

            }

            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
            }
        });

 

  • 获取当前显示的首尾item

 RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
                //判断是当前layoutManager是否为LinearLayoutManager
                // 只有LinearLayoutManager才有查找第一个和最后一个可见view位置的方法
                if (layoutManager instanceof LinearLayoutManager) {
                    LinearLayoutManager linearManager = (LinearLayoutManager) layoutManager;
                    //获取最后一个可见view的位置
                    int lastItemPosition = linearManager.findLastVisibleItemPosition();
                    //获取第一个可见view的位置
                    int firstItemPosition = linearManager.findFirstVisibleItemPosition();

 

  • 判断当前是否滑动到顶部或者底部

        //-1代表顶部,返回true表示没到顶,还可以滑
        //1代表底部,返回true表示没到底部,还可以滑
        boolean b = recyclerView.canScrollVertically(-1);

 

  • 刷新某个item中的某些控件

/**
     * 复写该方法,注意删除原本的super调用,因为其内部调用的是两个参数的onBindViewHolder方法,这样一//来就没有意义了,还是去执行了一般的onBindViewHolder方法刷新了整个item
     */
    @Override
    public void onBindViewHolder(@NonNull TrendsHolder holder, int position, @NonNull List<Object> payloads) {
        if(payloads.isEmpty()){
            onBindViewHolder(holder, position);
        }else {
            int type = (int) payloads.get(0);
            Result result = mData.get(position);
            switch (type) {
                case Constants.VIDEOACTION.DOWNLOAD:
                    holder.downloadNum.setText(formNum(result.getDownloadNum()));
                    break;
                case Constants.VIDEOACTION.WATCH:
                    holder.watchNum.setText(formNum(result.getWatchNum()));
                    break;
                case Constants.VIDEOACTION.SHARE:
                    holder.shareNum.setText(formNum(result.getShareNum()));
                    break;
            }
        }

    }


//只要第二个参数不为null,便是调用上面的方法
notifyItemChanged(position,Constants.VIDEOACTION.SHARE);

参考:

 

 

  • 实现类似viewpage的滑动效果,一滑刚好一个item

  new PagerSnapHelper().attachToRecyclerView(mRecyclerView);

 

  • 实现数据刷新

可以使用 Support 包中的 DiffUtil 类,这是新版本官方提供的类,可以检测数据发生变化的位置,并进行更新,可以用该类来避免出现数据刷新后,数据与视图不匹配的问题。

显示全文