Android 利用RecyclerView.Adapter刷新列表中的單個view問題


首先使用RecyclerView的adapter繼承:RecyclerView.Adapter

1 public class OrderListAdapter extends RecyclerView.Adapter {
2     //TODO
3 }

2、創建ViewHolder 需要繼承  

class ViewHolder extends RecyclerView.ViewHolder{
   //TODO  聲明view
   public ViewHolder(View convertView) {
    super(convertView);
        //TODO 初始化view
   }  
}

通過onCreateViewHolder 返回好創建的布局文件:

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View inflate = LayoutInflater.from(mContext).inflate(R.layout.xxxx, parent, false);
    return new ViewHolder(inflate);
}

接下來重點來了:

通過onBindViewHolder 帶List payloads 參數的方法來區分是現實列表中的同一位置的view的刷新:

@Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position, List payloads) {
     if (null == payloads || payloads.size() < 1) {
            onBindViewHolder(holder, position);
        } else if (mIsActivityTop) {
            for (Object payload : payloads) {
                // 刷新倒計時
                if (payload instanceof Integer && ((int) payload) == UPDATE_COUNT_DOWN_TIME) {
                    ((ViewHolder) holder).tv_time.setText("刷新了"));
                }
            }
        }  
}

傳入的整型:

1 private final static int UPDATE_COUNT_DOWN_TIME = 1;

而payloads可以List,這樣就可以區分刷新不同區域的view了.

而上面的調用的onBindViewHolder(holder, position),就是重寫的onBindViewHolder(holder, position)的方法了:

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    //TODO  寫綁定view 的邏輯以及顯示
}  

對於什么時候會調用到onBindViewHolder(holder, position, payloads)的方法:

當你寫倒計時的時候:(倒計時是用rxjava寫的,在onNext的時候)

Subscription adSkipTimer Observable.interval(1, TimeUnit.SECONDS)
                                .observeOn(AndroidSchedulers.mainThread())
                                .subscribe(new Subscriber<Long>() {
                                    @Override
                                    public void onCompleted() {

                                    }

                                    @Override
                                    public void onError(Throwable e) {

                                    }

                                    @Override
                                    public void onNext(Long aLong) {
                                        notifyItemRangeChanged(0, getItemCount(), UPDATE_COUNT_DOWN_TIME);
                                    }
                                }
                            });

通過 notifyItemRangeChanged 來調用onBindViewHolder(holder, position, payloads)的方法。

通過notifyDataSetChanged 來調用onBindViewHolder(holder, position)的方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM