Adapter的notifyDataSetChanged方法会通知RecyclerView刷新全部的可见列表项。
    在CriminalIntent应用里,这个方法不够高效,我们知道,返回CrimeListFragment时,最多只有一个Crime
实例会发生变化。
    只需要刷新列表项中的单个crime项的话,应该使用RecyclerView.Adapter的notifyItemChanged(int)方法。修改代码调用这个方法很简单,但如何定位并刷新具体位置的列表项呢?这是个问题。

  

之前在CriminalIntent应用里面为itemView实现了点击事件。

 1 private class CrimeHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
 2 
 3         ......
 4 
 5         public CrimeHolder(View itemView){
 6             super(itemView);
 7             itemView.setOnClickListener(this);
 8             mTitleTextView = (TextView)itemView.findViewById(R.id.list_item_crime_title_text_view);
 9             mDateTextView = (TextView)itemView.findViewById(R.id.list_item_crime_date_text_view);
10             mSolvedCheckBox = (CheckBox)itemView.findViewById(R.id.list_item_crime_solved_check_box);
11         }
12 
13         @Override
14         public void onClick(View v){16             Intent intent = CrimeActivity.newIntent(getActivity(),mCrime.getId());
17             startActivity(intent);
18         }
19 
20         ......
21     }        

所以现在可以通过点击事件获取到我们点击条目的位置。

 

首先添加一个全局变量

int position;

然后修改onClick()中的方法

@Override
        public void onClick(View v){
            position = mCrimeRecyclerView.getChildAdapterPosition(v); //将获取到的位置赋值给之前定义的变量
            Intent intent = CrimeActivity.newIntent(getActivity(),mCrime.getId());
            startActivity(intent);
        }

这里简单说下RecyclerView.getChildAdapterPosition()方法,此方法可以获取ItemView在Adapter中的位置。它接受一个view参数,将onClick()方法中的view参数传入即可。

最后修改updataUI()方法中的刷新方法

 private void updateUI(){
        //单例模式获取CrimeLab 对象
        CrimeLab crimeLab = CrimeLab.get(getActivity());
        //获取数据
        List<Crime> crimes = crimeLab.getCrimes();

        if(mAdapter == null){
            mAdapter = new CrimeAdapter(crimes);
            mCrimeRecyclerView.setAdapter(mAdapter);
        }else{
            mAdapter.notifyItemChanged(position); //这里使用的是notifyItemChanged()方法。 传入的参数为position
        }
    }

 

 

github:https://github.com/FlashFrog/CriminalIntentChallenge.git