- 1、创建带联系警方按钮的新布局
list_item_crime_layour.xml
<?xml version="1.0" encoding="utf-8"?>
<!--列表项视图 -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="8dp"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:orientation="vertical"
>
<TextView
android:id="@+id/crime_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Crime Title"
/>
<TextView
android:id="@+id/crime_date"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Crime Date"
/>
</LinearLayout>
<Button
android:id="@+id/police_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="8"
android:text="@string/Police"
/>
</LinearLayout>
- 2、在Crime.java中添加新变量mRequirePolie和相应的方法
public class Crime {
......
private int mRequirePolice;
public void setRequirePolice(int requirePolice){ mRequirePolice = requirePolice; }
public int getRequirePolice() { return mRequirePolice; }
}
然后再CrimeLab中使用该变量(假设奇数时需要呼叫警察,只要能区分就行)
private CrimeLab(Context context){
mCrimes = new ArrayList<>();
for (int i = 0; i < 100; i++){
Crime crime = new Crime();
crime.setTitle("Crime #" + i);
crime.setSolved(i % 2 == 0);
crime.setRequirePolice(i % 2);
mCrimes.add(crime);
}
}
- 3、创建新的容器用于显示新的视图
//新建一个ViewHolder
private class CrimePoliceHolder extends RecyclerView.ViewHolder{
private TextView mTitleTextView;
private TextView mDateTextView;
private Crime mCrime;
private Button mButton;
public CrimePoliceHolder(LayoutInflater inflater, ViewGroup parent){
super(inflater.inflate(R.layout.list_item_crime_police, parent, false));
mTitleTextView = (TextView)itemView.findViewById(R.id.crime_title);
mDateTextView = (TextView)itemView.findViewById(R.id.crime_date);
mButton = (Button)itemView.findViewById(R.id.police_button);
}
public void bind(Crime crime){
mCrime = crime;
mTitleTextView.setText(mCrime.getTitle());
mDateTextView.setText(mCrime.getDate().toString());
mButton.setText(R.string.Police);
}
}
- 4、再CrimeAdapter类中重写getItemView(int)方法
@Override
public int getItemViewType(int postion){
if (mCrimes.get(postion).getRequirePolice() == 1)
return 1;
else
return 0;
}
- 5、根据不同的view type值使用不同的布局,通过修改CrimeAdapter实现
根据不同的viewtype绑定不同的viewholder
//创建Adapter
private class CrimeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private List<Crime> mCrimes;
public CrimeAdapter(List<Crime> crimes){
mCrimes = crimes;
}
@Override
//RecyclerView需要新的ViewHolder显示列表时会调用onCreateViewHolder方法
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
if (viewType == 0)
return new CrimeHolder(layoutInflater, parent);
else
return new CrimePoliceHolder(layoutInflater, parent);
}
@Override
//每次RecyclerView需要CrimeHolder绑定对应的Crime时都会调用该方法
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position){
Crime crime = mCrimes.get(position);
if (getItemViewType(position) == 0)
((CrimeHolder)holder).bind(crime);
else
((CrimePoliceHolder)holder).bind(crime);
}
@Override
public int getItemCount(){
return mCrimes.size();
}
@Override
public int getItemViewType(int postion){
if (mCrimes.get(postion).getRequirePolice() == 1)
return 1;
else
return 0;
}
}