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()方法就不会报错,但是会牺牲效率。建议可以弄一个变量记录是否为删除动作,再根据判断具体调用不同的更新方法。
网友评论