1、首先要使用RecyclerView.Adapter的notifyItemChanged(int)方法实现只需要刷新列表项中的单个crime项。
2、需要知道该方法中的参数(int position),
3、在RecyclerView中有个getPosition()函数,可以获取该项的在给定列表中的位置。
/**
* Returns the adapter position of the item represented by the given View. This does not
* contain any adapter changes that might have happened after the last layout.
*
* @param view The view to query
* @return The adapter position of the item which is rendered by this View.
*/
public int getPosition(View view) {
return ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition();
}
4、可以把该函数放在CrimeAdapter类中也可以放在CrimeHolder类中。
5、只有在用户点击某个crime项时,程序才知道位置,所以应该在onClick()方法中给全局变量position 赋值。
6、最后在updeUI()函数中使用position即可。
P.S.
可以尝试通过crime项的Id来确定点击的crime项在list列表中的索引位置。
不知道是否可行。
//CimeListFragment.java
package com.example.*****.criminalintent;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
/**
* Created by ***** on 2017/4/27.
*/
public class CrimeListFragment extends Fragment {
private RecyclerView mCrimeRecyclerView;
private CrimeAdapter mAdapter;
private int position;//设置列表项位置的全局变量
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState){
View view = inflater.inflate(R.layout.fragment_crime_list, container, false);
mCrimeRecyclerView = (RecyclerView)view
.findViewById(R.id.crime_recycler_view);
mCrimeRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
updateUI();
return view;
}
@Override
public void onResume(){
super.onResume();
updateUI();
}
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.notifyItemChanged(position); //更新视图函数中采用notifyItemChanged(int)方法。
}
}
private class CrimeHolder extends RecyclerView.ViewHolder
implements View.OnClickListener{
private Crime mCrime;
private TextView mTitleTextView;
private TextView mDateTextView;
private CheckBox mSolvedCheckBox;
public CrimeHolder(View itemView){
super(itemView);
itemView.setOnClickListener(this);
mTitleTextView = (TextView) itemView
.findViewById(R.id.list_item_crime_title_text_view);
mDateTextView = (TextView)
itemView.findViewById(R.id.list_item_crime_date_text_view);
mSolvedCheckBox = (CheckBox)
itemView.findViewById(R.id.list_crime_solved_check_box);
}
public void bindCrime(Crime crime){
mCrime = crime;
mTitleTextView.setText(mCrime.getTitle());
mDateTextView.setText(mCrime.getDate().toString());
mSolvedCheckBox.setChecked(mCrime.isSovled());
}
@Override
public void onClick(View v){
Intent intent = CrimeActivity.newIntent(getActivity(), mCrime.getId());
position = getPosition(v); //在点击列表中某一项的同时获取该项在列表中的位置。
startActivity(intent);
}
//该函数可以在RecyclerView的源代码中获取,只需复制粘贴就可以用了。
public int getPosition(View view) {
return ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition();
}
}
private class CrimeAdapter extends RecyclerView.Adapter<CrimeHolder>{
private List<Crime> mCrimes;
public CrimeAdapter(List<Crime> crimes){
mCrimes = crimes;
}
@Override
public CrimeHolder onCreateViewHolder(ViewGroup parent, int viewType){
LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
View view = layoutInflater
.inflate(R.layout.list_item_crime, parent, false);
return new CrimeHolder(view);
}
@Override
public void onBindViewHolder(CrimeHolder holder, int position){
Crime crime = mCrimes.get(position);
holder.bindCrime(crime);
}
@Override
public int getItemCount(){
return mCrimes.size();
}
}
}