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

本文介绍两种实现RecyclerView高效刷新的方法:一是通过Fragment返回结果并获取列表中元素的位置;二是直接在列表项点击监听中记录位置信息。

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

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值