8.2Android编程权威指南(第3版)————挑战练习RecyclerView ViewType

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