我们知道recyclerView有好几个notify
除了最常用的notifyDataSetChanged()以外,还有下面的那些,知道position就可以进行更新了 但是!我得知道位置才能做到定向更新,那么我不想让所有都更新呢? 实际开发中其实经常有这种情况,可能只是调整一小部分,根本不需要整体全部刷一遍,下面进入正题
首先,项目里用到了
1 2 3 4 compile 'com.android.support:appcompat-v7:24.2.1' compile 'io.reactivex.rxjava2:rxjava:2.0.0-RC4' compile 'io.reactivex.rxjava2:rxandroid:2.0.0-RC1' compile 'com.android.support:recyclerview-v7:24.2.1'
当然rxjava不是必须的。。。不懂也没关系,这不是重点 上代码,其实就2个类,一个MainActivity,一个是Adapter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 public class MainActivity extends AppCompatActivity { private RecyclerView mRv; private Button mBtn; private List<Bean> mDatas; private DiffAdapter diffAdapter; private List<Bean> mNewDatas; @Override protected void onCreate (Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); initEvent(); } private void initView () { mRv = getView(R.id.rv); mBtn = getView(R.id.btn); } private void initData () { mDatas = new ArrayList<>(); for (int i = 0 ; i < 10 ; i++) { mDatas.add(new Bean(i, "name" + i)); } } private void initEvent () { mRv.setLayoutManager(new LinearLayoutManager(this )); diffAdapter = new DiffAdapter(this , mDatas); mRv.setAdapter(diffAdapter); mBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick (View v) { refresh(); } }); } private void refresh () { mNewDatas = new ArrayList<>(); mNewDatas.addAll(mDatas); mNewDatas.remove(0 ); Random random = new Random(); int i = random.nextInt(10 ); mNewDatas.add(new Bean(i, "add" + i)); Observable.fromArray(mDatas) .map(new Function<List<Bean>, DiffUtil.DiffResult>() { @Override public DiffUtil.DiffResult apply (List<Bean> been) throws Exception { return DiffUtil.calculateDiff(new DiffUtil.Callback() { @Override public int getOldListSize () { return mDatas == null ? 0 : mDatas.size(); } @Override public int getNewListSize () { return mNewDatas == null ? 0 : mNewDatas.size(); } @Override public boolean areItemsTheSame (int oldItemPosition, int newItemPosition) { return mDatas.get(oldItemPosition).getId() == mNewDatas.get(newItemPosition).getId(); } @Override public boolean areContentsTheSame (int oldItemPosition, int newItemPosition) { return TextUtils.equals(mDatas.get(oldItemPosition).getName(), mNewDatas.get(newItemPosition).getName()); } @Nullable @Override public Object getChangePayload (int oldItemPosition, int newItemPosition) { Bean oldBean = mDatas.get(oldItemPosition); Bean newBean = mNewDatas.get(newItemPosition); if (!TextUtils.equals(oldBean.getName(), newBean.getName())) { return newBean.getName(); } else { return null ; } } }); } }) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<DiffUtil.DiffResult>() { @Override public void accept (DiffUtil.DiffResult diffResult) throws Exception { diffResult.dispatchUpdatesTo(diffAdapter); mDatas = mNewDatas; diffAdapter.setData(mDatas); } }); } private <T extends View> T getView (int id) { return (T)findViewById(id); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 public class DiffAdapter extends RecyclerView .Adapter <DiffAdapter .DiffVh > { private List<Bean> mDatas; private Context mContext; public DiffAdapter (Context context, List<Bean> datas) { mContext = context; mDatas = datas; } @Override public DiffAdapter.DiffVh onCreateViewHolder (ViewGroup parent, int viewType) { return new DiffVh(LayoutInflater.from(mContext).inflate(R.layout.item_rv,parent,false )); } @Override public void onBindViewHolder (DiffAdapter.DiffVh holder, int position) { holder.tvTitle.setText(mDatas.get(position).getId()+"" ); holder.tvDesc.setText(mDatas.get(position).getName()); } @Override public void onBindViewHolder (DiffAdapter.DiffVh holder, int position, List<Object> payloads) { if (payloads.isEmpty()) { onBindViewHolder(holder,position); }else { holder.tvDesc.setText((CharSequence) payloads.get(0 )); } } @Override public int getItemCount () { return mDatas==null ?0 :mDatas.size(); } public void setData (List<Bean> mDatas) { this .mDatas = mDatas; } class DiffVh extends RecyclerView .ViewHolder { TextView tvTitle; TextView tvDesc; DiffVh(View itemView) { super (itemView); tvTitle = (TextView) itemView.findViewById(R.id.tv_title); tvDesc = (TextView) itemView.findViewById(R.id.tv_desc); } } }
布局文件不贴了吧R.layout.item_rv就是2个textview用来显示Bean的id和nameR.layout.activity_main就是一个recyclerview和一个button用来刷新而已 OK,到此为止,怎么用都在注释里