美文网首页Android开发Android开发经验谈Android技术知识
Android编程权威指南(第2版)—第14章挑战练习

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

作者: 亚欧沙龙 | 来源:发表于2018-08-11 11:49 被阅读5次

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

    具体访问我的Github

    相关文章

      网友评论

        本文标题:Android编程权威指南(第2版)—第14章挑战练习

        本文链接:https://www.haomeiwen.com/subject/hwxdbftx.html