您的位置:首页 > 移动开发 > Android开发

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

2017-09-10 17:11 393 查看
14.8 挑战练习:删除Crime记录

修改CrimeLab的deleteCrime方法

public void deleteCrime(Crime c) {
//mCrimes.remove(c);

mDatabase.delete(
CrimeTable.NAME,
CrimeTable.Cols.UUID + " = ?",
new String[] { c.getId().toString() }
);
}

前面的练习都做了并修改程序添加新功能的同学会发现,直接修改这个deleteCrime方法,运行删除后,app会意外终止,
RecyclerView 报IndexOutOfBoundsException。那是因为我们之前为了实现修改crime内容返回后,更新列表里的单一crime而不是全部更新的代码报错了

private void updateUI() {
CrimeLab crimeLab = CrimeLab.get(getActivity());
List<Crime> crimes = crimeLab.getCrimes();

if (mAdapter == null) {
mAdapter = new CrimeAdapter(crimes);
mCrimeRecyclerView.setAdapter(mAdapter);
} else {
mAdapter.setCrimes(crimes);
mAdapter.notifyDataSetChanged(); //全量更新
//mAdapter.notifyItemChanged(mIndex); //单例更新 -- 此行报错
}

if (crimes.size() != 0) {
mNoCrimeTextView.setVisibility(View.INVISIBLE);
mNoCrimeButton.setVisibility(View.INVISIBLE);
} else {
mNoCrimeTextView.setVisibility(View.VISIBLE);
mNoCrimeButton.setVisibility(View.VISIBLE);
}

updateSubtitle();

}

调用deleteCrime方法后,该Crime实例已经从数据库中删除了。
改回原来的notifyDataSetChanged()方法就不会报错,但是会牺牲效率。

建议可以弄一个变量记录是否为删除动作,再根据判断具体调用不同的更新方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: