RecyclerView動(dòng)態(tài)刷新item,并實(shí)現(xiàn)點(diǎn)擊監(jiān)聽

效果實(shí)現(xiàn)為需要展示一個(gè)列表并進(jìn)行數(shù)據(jù)刷新,之前因?yàn)橄胫褂肔istView,在BaseAdapter中添加自定義的addList方法后直接進(jìn)行notifysetdatachanged,但是因?yàn)閿?shù)據(jù)刷新的頻率太高,導(dǎo)致條目的點(diǎn)擊事件無法執(zhí)行...

所以改用可靠的RecycleView,自定義條目點(diǎn)擊事件,并重寫方法onBindViewHolder方法

使用下面的方法進(jìn)行條目的內(nèi)容刷新,不影響條目點(diǎn)擊事件
notifyItemChanged(position,1);
參數(shù)1傳入刷洗條目的position
參數(shù)2為Object類型的payload,payload不為null更新條目上的內(nèi)容,為null則調(diào)用兩個(gè)函數(shù)的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;
    }
    //設(shè)置控件信息
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {

        // 點(diǎn)擊事件一般都寫在綁定數(shù)據(jù)這里,當(dāng)然寫到上邊的創(chuàng)建布局時(shí)候也是可以的
        if (mItemClickListener != null){
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 這里利用回調(diào)來給RecyclerView設(shè)置點(diǎn)擊事件
                    mItemClickListener.onItemClick(position);
                }
            });
        }
        /**
         * 下面這部分代碼根據(jù)實(shí)際需求進(jìn)行邏輯判斷設(shè)置,只是大致舉個(gè)例子
         */
        //獲取你的列表集合中的數(shù)據(jù)進(jìn)行添加設(shè)置,顯示再item上
        String string = arrayList.get(position);
        //拿到你的ViewHolder上的控件進(jìn)行設(shè)置
        holder.name.setText(string);

    }

    /**
     * 重寫的onBindViewHolder方法,通過payloads是否為null判斷需不需要調(diào)用兩個(gè)參數(shù)的onBindViewHolder(holder, position);方法
     * @param holder
     * @param position
     * @param payloads
     */
    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position, List<Object> payloads) {


        // 點(diǎn)擊事件一般都寫在綁定數(shù)據(jù)這里,當(dāng)然寫到上邊的創(chuàng)建布局時(shí)候也是可以的
        if (mItemClickListener != null){
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 這里利用回調(diào)來給RecyclerView設(shè)置點(diǎn)擊事件
                    mItemClickListener.onItemClick(position);
                }
            });
        }
        //payloads為null的情況,此時(shí)進(jìn)行條目刷新
        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();
    }

    /**
     * 這個(gè)就是根據(jù)邏輯進(jìn)行頻繁調(diào)用的addList方法
     * 按照目前的邏輯是不停給list添加string,你可以根據(jù)需要去傳入對(duì)象或者int值啥的
     * @param string
     */
    public void addList(String string) {
        arrayList.add(string);
        /**
         * 這里其實(shí)不需要更新,因?yàn)樘砑右粋€(gè)新的item本身就是更新,只是進(jìn)行舉例?。?!
         * position:這里會(huì)根據(jù)第一個(gè)參數(shù)的position去確定更新的條目可以根據(jù)實(shí)際業(yè)務(wù)進(jìn)行判斷傳入什么
         * payload:這是個(gè)object類型的,只需要傳入作為一個(gè)標(biāo)識(shí)即可,這樣在調(diào)用時(shí)就會(huì)走三個(gè)參數(shù)的onBindViewHolder方法
         */

        notifyItemChanged(arrayList.size()-1,1);

    }

}

    //清空list集合,看你的實(shí)際業(yè)務(wù)需求用不用
    public void clear() {
        arrayList.clear();
    }

    /**
     * 利用接口 -> 給RecyclerView設(shè)置點(diǎn)擊事件
     */
    private ItemClickListener mItemClickListener ;
    public interface ItemClickListener{
        public void onItemClick(int position) ;
    }
    public void setOnItemClickListener(ItemClickListener itemClickListener){
        this.mItemClickListener = itemClickListener ;

    }


}

/**
 * 自定義的ViewHolder,持有每個(gè)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) {
    //點(diǎn)擊條目后進(jìn)行相應(yīng)的操作
    }
 });
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容