RecyclerView
想要展示列表View,要使用RecyclerView。只使用Adapter创建充满屏幕的ViewHolder,切换视图时回收上一个视图。
RecycleView的任务仅限于回收和定位屏幕上的ViewHolder。能够显示数据还需要另外两个类的支持。
ViewHolder
ViewHolder只做一件事,容纳一个View视图。RecyclerView不断创建ViewHolder.
Adapter
Adapter是一个控制器对象,从模型层获取数据然后提供给RecyclerView显示。负责:
- 创建必要的ViewHolder
- 绑定ViewHolder至模型层数据
首先,RecyclerView调用Adapter的getItemCount方法,询问有多少个对象。
接着,RecyclerView调用Adapter的onCreateViewHolder方法创建ViewHolder。
最后,RecyclerView会传入ViewHolder的位置,调用Adapter的onBindViewHolder方法绑定到ViewHolder视图上。
实现
首先创建一个ListFragment.java文件
onCreateView
inflater将xml文件转换成view
这里必须调用LayoutManger,因为RecycleView不会自己摆放列表项。
updateUI将RecyclerView与Adapter关联
ViewHolder
在ViewHolder中定义bind方法,方便在Adapter中的onBindViewHolder中调用。
updateUI
Adapter
private class ItemAdapter extends RecyclerView.Adapter {
private List<Crime> mCrimes;
public ItemAdapter(List<Crime> crimes) {
mCrimes = crimes;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//recycleView需要新的viewHolder显示列表项时,会调用此方法
LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
if (viewType == 1) {
return new PoliceHolder(layoutInflater, parent);
} else {
return new CrimeHolder(layoutInflater, parent);
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
Crime crime = mCrimes.get(position);//拿到相应位置的数据
if (this.getItemViewType(position) == 1) {
((PoliceHolder) holder).bind(crime);
} else {
((CrimeHolder) holder).bind(crime);
}
}
@Override
public int getItemCount() {
return mCrimes.size();//取得itemView的数目
}
@Override
public int getItemViewType(int position) {
if (mCrimes.get(position).isRequiresPolice()) {
return 1;//表示需要警察的item 设置1,2方便添加更多情况
} else {
return 0;
}
}
}
构造方法传入由updateUI创建的List<crime>,Adapter根据不同的ViewType创建viewHolder。
Comments are closed.