10.5 挑战练习:实现高效的RecyclerView刷新
++++++++++方法一:
其实10.4里面已经介绍了通过fragment获取返回结果的方法
(1)在CrimeLab中增加获取crime实例index位置的方法
public int getCrimeIndex (Crime crime) { return mCrimes.indexOf(crime); }
(2)在CrimeListFragment.java里面增加相应代码,只贴出跟书本不同的我添加的代码
这个练习的关键就是如何获得crime对象在对象列表里面的index位置
新建一个变量全局
private int mIndex;然后通过fragment返回的result获取index信息
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CRIME) { if (data != null) { mIndex = CrimeFragment.getCrimeIndex(data); } } }
(3)在CrimeFregment.java里面进行修改,新增以下常量及两个方法,通过intent的extra方法保存index,传给CrimeListFragment之后再通过
getCrimeIndex方法取出data里面保存的index
private static final String EXTRA_CRIME_ID = "extra_crime_id";
public void returnResult(int crime_index) { Intent data = new Intent(); data.putExtra(EXTRA_CRIME_ID, crime_index); getActivity().setResult(Activity.RESULT_OK, data); } public static int getCrimeIndex (Intent result) { return result.getIntExtra(EXTRA_CRIME_ID, 0); }
因为fragment没有没有自身的setResult方法,所以上面创建的
returnResult方法需要手动加代码进行调用。
创建全局变量,CrimeLab mCrimeLab 然后在onCreate方法里面,增加这几行代码
mCrimeLab = CrimeLab.get(getActivity()); mCrime = mCrimeLab.get(getActivity()).getCrime(crimeId); returnResult(mCrimeLab.getCrimeIndex(mCrime));
这样当我们点击列表的某个实例的时候,进入这个实例的CrimeFragment,就会通过onCreate来得到整个返回结果的设定了,
而这个index在整个明细界面展示和编辑过程是不会改变的,所以不用担心。
(4)修改updateUI()
//mAdapter.notifyDataSetChanged(); mAdapter.notifyItemChanged(mIndex);完成修改,通过运行 这个方法有点复杂,我觉得其实可以直接在list界面的onClick监听里面增加记录代码的处理,这样更简单。
不过我上面的做法也是全当练习啦
++++++++++方法二:(1)同样在CrimeLab中增加获取crime实例index位置的方法
public int getCrimeIndex (Crime crime) { return mCrimes.indexOf(crime); }
(2)
在list界面的onClick监听里面增加记录代码的处理
新建一个变量全局
private int mIndex;
@Override public void onClick(View v) { CrimeLab mCrimeLab = CrimeLab.get(getActivity()); mIndex = mCrimeLab.getCrimeIndex(mCrime);
Intent intent = CrimeActivity.newIntent(getActivity(), mCrime.getId()); startActivity(intent); //startActivityForResult(intent, REQUEST_CRIME); }
(3)修改updateUI()
//mAdapter.notifyDataSetChanged(); mAdapter.notifyItemChanged(mIndex);完成修改,通过运行