美文网首页
RecyclerView动态刷新item,并实现点击监听

RecyclerView动态刷新item,并实现点击监听

作者: 天橙星 | 来源:发表于2021-10-30 15:04 被阅读0次

    效果实现为需要展示一个列表并进行数据刷新,之前因为想着使用ListView,在BaseAdapter中添加自定义的addList方法后直接进行notifysetdatachanged,但是因为数据刷新的频率太高,导致条目的点击事件无法执行...

    所以改用可靠的RecycleView,自定义条目点击事件,并重写方法onBindViewHolder方法

    使用下面的方法进行条目的内容刷新,不影响条目点击事件
    notifyItemChanged(position,1);
    参数1传入刷洗条目的position
    参数2为Object类型的payload,payload不为null更新条目上的内容,为null则调用两个函数的onBindViewHolder方法

    RecyclerView.Adapter代码如下

    public  class MyListAdapter extends RecyclerView.Adapter<MyViewHolder>{
    
        //recycleView展示的集合列表
        private ArrayList<String> arrayList;
    
    
        public MyListAdapter() {
            super();
            arrayList = new ArrayList<>();
    
        }
    
        @NonNull
        @Override
        public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            //传入你的Item布局
            View view = View.inflate(parent.getContext(),R.layout.XXXXX,null);
            MyViewHolder holder = new MyViewHolder(view);
            return holder;
        }
        //设置控件信息
        @Override
        public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {
    
            // 点击事件一般都写在绑定数据这里,当然写到上边的创建布局时候也是可以的
            if (mItemClickListener != null){
                holder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        // 这里利用回调来给RecyclerView设置点击事件
                        mItemClickListener.onItemClick(position);
                    }
                });
            }
            /**
             * 下面这部分代码根据实际需求进行逻辑判断设置,只是大致举个例子
             */
            //获取你的列表集合中的数据进行添加设置,显示再item上
            String string = arrayList.get(position);
            //拿到你的ViewHolder上的控件进行设置
            holder.name.setText(string);
    
        }
    
        /**
         * 重写的onBindViewHolder方法,通过payloads是否为null判断需不需要调用两个参数的onBindViewHolder(holder, position);方法
         * @param holder
         * @param position
         * @param payloads
         */
        @Override
        public void onBindViewHolder(MyViewHolder holder, final int position, List<Object> payloads) {
    
    
            // 点击事件一般都写在绑定数据这里,当然写到上边的创建布局时候也是可以的
            if (mItemClickListener != null){
                holder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        // 这里利用回调来给RecyclerView设置点击事件
                        mItemClickListener.onItemClick(position);
                    }
                });
            }
            //payloads为null的情况,此时进行条目刷新
            if (payloads.isEmpty()) {
                onBindViewHolder(holder, position);
            }
            //payloads不为null的情况
            else {
                final String string = arrayList.get(position);
                if (string != null) {
                    holder.name.setText(string);
                }
            }
        }
    
    
    
    
        @Override
        public int getItemCount() {
            return arrayList.size();
        }
    
        /**
         * 这个就是根据逻辑进行频繁调用的addList方法
         * 按照目前的逻辑是不停给list添加string,你可以根据需要去传入对象或者int值啥的
         * @param string
         */
        public void addList(String string) {
            arrayList.add(string);
            /**
             * 这里其实不需要更新,因为添加一个新的item本身就是更新,只是进行举例!!!
             * position:这里会根据第一个参数的position去确定更新的条目可以根据实际业务进行判断传入什么
             * payload:这是个object类型的,只需要传入作为一个标识即可,这样在调用时就会走三个参数的onBindViewHolder方法
             */
    
            notifyItemChanged(arrayList.size()-1,1);
    
        }
    
    }
    
        //清空list集合,看你的实际业务需求用不用
        public void clear() {
            arrayList.clear();
        }
    
        /**
         * 利用接口 -> 给RecyclerView设置点击事件
         */
        private ItemClickListener mItemClickListener ;
        public interface ItemClickListener{
            public void onItemClick(int position) ;
        }
        public void setOnItemClickListener(ItemClickListener itemClickListener){
            this.mItemClickListener = itemClickListener ;
    
        }
    
    
    }
    
    /**
     * 自定义的ViewHolder,持有每个Item的的所有界面元素
     */
    public  class MyViewHolder extends RecyclerView.ViewHolder {
        private final TextView name;
    
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
    
            name = (TextView) itemView.findViewById(R.id.name);
    
        }
    }
    
    
    MyListAdapter myListAdapter = new MyListAdapter();
     myListAdapter.setOnItemClickListener(new XXX(你的adapter所在的类).MyListAdapter.ItemClickListener() {
        @Override
        public void onItemClick(int position) {
        //点击条目后进行相应的操作
        }
     });

    相关文章

      网友评论

          本文标题:RecyclerView动态刷新item,并实现点击监听

          本文链接:https://www.haomeiwen.com/subject/nqhgaltx.html