8.2Android编程权威指南(第3版)————挑战练习RecyclerView ViewType
public class Crime {
/*UUID是Android框架里的Java工具类。有了它,产生唯一ID值就方便多了。在构造方法里,调
用UUID.randomUUID()产生一个随机唯一ID值。*/
private UUID mId;
private String mTitle;
private Date mDate;
private boolean mSolved;
private boolean mRequiresPolice;
public boolean isRequiresPolice() {
return mRequiresPolice;
}
public Crime setRequiresPolice(boolean requiresPolice) {
mRequiresPolice = requiresPolice;
return this;
}
public Crime() {
mId = UUID.randomUUID();
mDate = new Date();
}
//使用快捷键Alt+Shift+Insert-->Gettet And Setter即可生成set、get方法
public UUID getId() {
return mId;
}
public String getTitle() {
return mTitle;
}
public Crime setTitle(String title) {
mTitle = title;
return this;
}
public Date getDate() {
return mDate;
}
public Crime setDate(Date date) {
mDate = date;
return this;
}
public boolean isSolved() {
return mSolved;
}
public Crime setSolved(boolean solved) {
mSolved = solved;
return this;
}
}
public class CrimeLab {
/**
* crime数组对象将存储在一个单例里。单例是特殊的Java类,在创建实例时,一个单例类仅允
* 许创建一个实例。应用能在内存里活多久,单例就能活多久。因此将对象列表保存在单例里的话,就能随时获
* 取crime数据,不管activity和fragment的生命周期怎么变化。使用单例还要注意一点:Android从
* 内存里清除应用时,单例对象也会随之消失。虽然CrimeLab单例不是数据持久保存的好方案,
* 但它确实能保证仅拥有一份crime数据,并且能让控制器层类间的数据传递更容易。
*/
//注意sCrimeLab变量的s前缀。这是Android开发的命名约定,一看到此前缀,就知道sCrimeLab是一个静态变量。
private static CrimeLab sCrimeLab;
private List<Crime> mCrimes;
private CrimeLab() {
mCrimes = new ArrayList<>();
for (int i = 0; i < 100; i++) {
Crime crime = new Crime();
crime.setTitle("Crime #" + i);
crime.setSolved(i % 2 == 0); // Every other one
crime.setRequiresPolice(i % 4 == 0);
mCrimes.add(crime);
}
}
public static CrimeLab get(CrimeListFragment context) {
if (sCrimeLab == null) {
sCrimeLab = new CrimeLab();
}
return sCrimeLab;
}
public List<Crime> getCrimes() {
return mCrimes;
}
public Crime getCrime(UUID id) {
for (Crime crime : mCrimes) {
if (crime.getId().equals(id)) {
return crime;
}
}
return null;
}
}
public class CrimeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context mContext;
private List<Crime> mCrimes;
public CrimeAdapter(Context context, List<Crime> crimes) {
this.mContext = context;
this.mCrimes = crimes;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(mContext);
if (viewType == 0) {
return new CrimeViewHolder(layoutInflater, parent, mContext);
} else {
return new CrimePoliceViewHolder(layoutInflater, parent, mContext);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {//主要作用是起显示的功能
if (holder instanceof CrimeViewHolder) {
Crime crime = mCrimes.get(position);
((CrimeViewHolder) holder).bind(crime);
} else if (holder instanceof CrimePoliceViewHolder) {
Crime crime = mCrimes.get(position);
((CrimePoliceViewHolder) holder).bind(crime);
}
}
@Override
public int getItemViewType(int position) {
int flag = 0;
if (mCrimes.get(position).isRequiresPolice()) {
flag = 1;
}
return flag;
}
@Override
public int getItemCount() {
return mCrimes.size();
}
}
//容纳View视图
class CrimeViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
Crime mCrime;
private TextView mTitleTextView;
private TextView mDateTextView;
Context mContext;
/**
* onCreateViewHolder(ViewGroup, int)方
* 法的调用并不频繁。一旦有了够用的ViewHolder,RecyclerView就会停止调用onCreate-
* ViewHolder(...)方法。随后,它会回收利用旧的ViewHolder以节约时间和内存
*/
public CrimeViewHolder(LayoutInflater inflater, ViewGroup parent, Context context) {
super(inflater.inflate(R.layout.list_item_crime, parent, false));
this.mContext = context;
mTitleTextView = (TextView) itemView.findViewById(R.id.crime_title);
mDateTextView = (TextView) itemView.findViewById(R.id.crime_data);
itemView.setOnClickListener(this);
}
public void bind(Crime crime) {
mCrime = crime;
mTitleTextView.setText(mCrime.getTitle());
mDateTextView.setText(mCrime.getDate().toString());
}
@Override
public void onClick(View view) {
Toast.makeText(mContext,
mCrime.getTitle() + " clicked!", Toast.LENGTH_SHORT)
.show();
}
}
//容纳View视图
class CrimePoliceViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
Crime mCrime;
private TextView mTitleTextView;
private TextView mDateTextView;
Context mContext;
private final Button mCallPolice;
/**
* onCreateViewHolder(ViewGroup, int)方
* 法的调用并不频繁。一旦有了够用的ViewHolder,RecyclerView就会停止调用onCreate-
* ViewHolder(...)方法。随后,它会回收利用旧的ViewHolder以节约时间和内存
*/
public CrimePoliceViewHolder(LayoutInflater inflater, ViewGroup parent, Context context) {
super(inflater.inflate(R.layout.list_item_crime2, parent, false));
this.mContext = context;
mTitleTextView = (TextView) itemView.findViewById(R.id.crime_title);
mDateTextView = (TextView) itemView.findViewById(R.id.crime_data);
mCallPolice = (Button) itemView.findViewById(R.id.call_police);
itemView.setOnClickListener(this);
mCallPolice.setOnClickListener(this);
}
public void bind(Crime crime) {
mCrime = crime;
mTitleTextView.setText(mCrime.getTitle());
mDateTextView.setText(mCrime.getDate().toString());
}
@Override
public void onClick(View view) {
Toast.makeText(mContext, "报警", Toast.LENGTH_SHORT).show();
}
}
Demo下载地址:
https://download.****.net/download/weixin_43953649/10864903