《Android程式設計權威指南(第三版)》第八章挑戰練習Demo
第8章的直接就說RecyclerView,書本說的很詳細就不闡述了,這次代碼應該做注釋的我都做了,廢話少說,先發一張效果動态圖:
貼代碼,先是建立布局,其實就是加了一個按鈕:
<?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="vertical"
android:padding="8dp">
<TextView
android:id="@+id/crime_title_police"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Crime Title"/>
<TextView
android:id="@+id/crime_date_police"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Crime Date"/>
<Button
android:id="@+id/connect_police"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Connect"
android:textAllCaps="false"/>
</LinearLayout>
更改Crime類:
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();
}
更改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);
//定義item序号為3或7的倍數時就是聯系警察
crime.setRequiresPolice(i % 3 == 0 || i % 7 == 0);
mCrimes.add(crime);
}
}
最重要的的擴充卡代碼和Holader:
/**
* 建立一個專門給警察Police的Holder,其實和CrimeHolder差不多
*/
private class CrimePoliceHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView mTitleTextView;
private TextView mDateTextView;
private Button mConnect;
private Crime mCrime;
private CrimePoliceHolder(LayoutInflater inflater, ViewGroup parent) {
super(inflater.inflate(R.layout.list_item_crime_police, parent, false));
mTitleTextView = (TextView) itemView.findViewById(R.id.crime_title_police);
mDateTextView = (TextView) itemView.findViewById(R.id.crime_date_police);
mConnect = (Button) itemView.findViewById(R.id.connect_police);
mConnect.setOnClickListener(this);
}
private void bind(Crime crime) {
mCrime = crime;
mTitleTextView.setText(mCrime.getTitle());
mDateTextView.setText(mCrime.getDate().toString());
}
public void onClick(View view) {
Toast.makeText(getActivity(), "已聯系警察", Toast.LENGTH_SHORT).show();
}
}
private class CrimeAdapter extends RecyclerView.Adapter {
private List<Crime> mCrimes;
public CrimeAdapter(List<Crime> crimes) {
mCrimes = crimes;
}
/**
* 這裡最重要,擷取目前item是否需要聯系警察
*/
@Override
public int getItemViewType(int position) {
int flag = 0;
if (mCrimes.get(position).isRequiresPolice()){
flag = 1;
}
return flag;
}
/**
* getItemViewType的傳回值傳回到這裡的viewType裡面,通過判斷viewType的值判斷添加什麼布局
*/
@Override
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
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof CrimeHolder) {
Crime crime = mCrimes.get(position);
((CrimeHolder) holder).bind(crime);
} else if (holder instanceof CrimePoliceHolder){
Crime crime = mCrimes.get(position);
((CrimePoliceHolder) holder).bind(crime);
}
}
@Override
public int getItemCount() {
return mCrimes.size();
}
}
這次的挑戰練習主要是學會判斷recyclerview的item判斷,類似于recyclerview嵌套,關于recyclerview嵌套我有寫過相關的部落格,大家可以點選這裡檢視,本次挑戰練習的Demo代碼。