Android编程权威指南(第2版)—第10章挑战练习

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);
完成修改,通过运行

你可能感兴趣的:(Android编程权威指南(第2版)—第10章挑战练习)