修改4个部分,
先修改list_item_crime的布局,然后需要相应地修改Crime和CrimeLab,添加 Boolean isRequesPoilice以及出初始化sRequesPoilice的值,将ID为3的倍数的Crime对象设置为需要呼叫
最后在CriemListFragment中修改,有几处需要注意的,在RecyclerView中创建了两类列表项,一般性Crime,需要警方介入的crime,所以需要用到RecyclerView.addapter中的(view type), 并借助getItemTYpe(int)判断。
public class CrimeListFragment extends Fragment {
private RecyclerView mCrimeRecyclerView;
private CrimeAdapter mAdapter;
@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;
}
private void updateUI() {
CrimeLab crimeLab = CrimeLab.get(getActivity());
List<Crime> crimes = crimeLab.getCrimes();
mAdapter = new CrimeAdapter(crimes);
mCrimeRecyclerView.setAdapter(mAdapter);
}
private abstract class CrimeHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
Crime mCrime;
private TextView mTitleTextView;
private TextView mDateTextView;
public CrimeHolder(LayoutInflater inflater, ViewGroup parent, int layout) {
super(inflater.inflate(layout, parent, false));
itemView.setOnClickListener(this);
mTitleTextView = (TextView) itemView.findViewById(R.id.crime_title);
mDateTextView = (TextView) itemView.findViewById(R.id.crime_date);
}
public void bind(Crime crime) {
mCrime = crime;
mTitleTextView.setText((mCrime.getTitle()));
mDateTextView.setText(mCrime.getDate().toString());
}
@Override
public void onClick(View view) {
Toast.makeText(getActivity(), mCrime.getTitle() + " clicked!", Toast.LENGTH_SHORT).show();
}
}
private class RegularCrimeHolder extends CrimeHolder {
public RegularCrimeHolder(LayoutInflater inflater, ViewGroup parent) {
super(inflater, parent, R.layout.list_item_crime);
}
}
private class SeriousCrimeHolder extends CrimeHolder {
private Button mContactPoliceButton;
public SeriousCrimeHolder(LayoutInflater inflater, ViewGroup parent) {
super(inflater, parent, R.layout.list_item_serious_crime);
}
@Override
public void bind(Crime crime) {
super.bind(crime);
mContactPoliceButton = (Button) itemView.findViewById(R.id.contact_police_button);
mContactPoliceButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getActivity(), "Police contacted for " + mCrime.getTitle(), Toast.LENGTH_SHORT).show();
}
});
}
}
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());
if (viewType == 1) {
return new SeriousCrimeHolder(layoutInflater, parent);
}
return new RegularCrimeHolder(layoutInflater, parent);
}
@Override
public void onBindViewHolder(CrimeHolder holder, int position) {
Crime crime = mCrimes.get(position);
holder.bind(crime);
}
@Override
public int getItemCount() {
return mCrimes.size();
}
@Override
public int getItemViewType(int position) {
if (mCrimes.get(position).isRequiresPolice()) {
return 1;
}
return 0;
}
}
}
public class Crime {
private UUID mID;
private String mTitle;
private Date mDate;
private boolean mSolved;
private boolean mRequiresPolice;
public Crime() {
mID = UUID.randomUUID();
mDate = new Date();
}
public UUID getID() {
return mID;
}
public String getTitle() {
return mTitle;
}
public void setTitle(String title) {
mTitle = title;
}
public Date getDate() {
return mDate;
}
public void setDate(Date date) {
mDate = date;
}
public boolean isSolved() {
return mSolved;
}
public void setSolved(boolean solved) {
mSolved = solved;
}
public boolean isRequiresPolice() {
return mRequiresPolice;
}
public void setRequiresPolice(boolean requiresPolice) {
mRequiresPolice = requiresPolice;
}
}
public class CrimeLab {
public static CrimeLab sCrimeLab;
private List<Crime> mCrimes;
public static CrimeLab get(Context context) {
if (sCrimeLab == null) {
sCrimeLab = new CrimeLab(context);
}
return sCrimeLab;
}
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.setRequiresPolice(i % 3 == 0);
mCrimes.add(crime);
}
}
public List<Crime> getCrimes() {
return mCrimes;
}
public Crime getCrime(UUID id) {
for (Crime crime : mCrimes) {
if (crime.getID().equals(id)) {
return crime;
}
}
return null;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
<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"/>
<Button
android:id="@+id/contact_police_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Contact Police"/>