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

效果实现为需要展示一个列表并进行数据刷新,之前因为想着使用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{

    //recycleView展示的集合列表
    private ArrayList 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 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,并实现点击监听)