首先使用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)的方法。
