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

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 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()方法就不会报错,但是会牺牲效率。

建议可以弄一个变量记录是否为删除动作,再根据判断具体调用不同的更新方法。


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