Android编程权威指南(第二版)第九章-使用 RecyclerView 显示列表(这个很实用是本书的重点之一)
要使用列表视图,首先在模型层创建一个新的类,得到对象的集合,比如一个问题可以创建成一个Question类,在列表显示很多个Question,建立一个QuestionLab的question集合的单例,直接得到单例集合类就可以将集合中的question内容全部显示在列表视图中。
创建单例代码:(****表示类名)
public class ****{
private static **** name;
public static **** get(Context context) {
if (name== null) {
//如果是空的,说明还没有实例,那么调用私有的构造器得到实例
name= new ****(context);
}
return name;
//不是空的,说明实例已经创建,直接返回供外部使用即可
}
private CrimeLab(Context context) {
//注意是私有的构造器,只有上面的get方法中调用生成实例
//保证不会在其他的地方创建新,保证了实例的唯一性
}
}
顾名思义, RecyclerView 所做的就是回收再利用,循环往复。用户滑动屏幕切换视图时,上一个视图会被回收利用。RecyclerView 是 ViewGroup 的子类,每一个列表项都是作为一个View子对象显示的。这些View子对象既可以是复杂的View对象也可以是简单的 View 对象,这取决于我们对列表显示复杂度的需要。
第一步,添加依赖库-recyclerview-v7支持库
第二步,布局文件中添加RecyclerView视图
<android.support.v7.widget.RecyclerView ..../>
第三步,在fragment中找到布局中的RecyclerView 视图
public class ***Fragment extends Fragment {
private RecyclerView mRecyclerView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.RecyclerView所在的布局文件名称, container, false);
mRecyclerView = (RecyclerView) view
.findViewById(R.id.RecyclerView组件的id);
mRecyclerView.setLayoutManager(
new LinearLayoutManager(getActivity()));
return view;
}
}
注意,没有LayoutManager的支持,不仅RecyclerView无法工作,还会导致应用崩溃。所以, RecyclerView视图创建完成后,调用setLayoutManager就立即转交给了LayoutManager对象.
第四步,在Fragment中实现Adapter和ViewHolder(内部类) RecyclerView 自身不会创建视图,它创建的是 ViewHolder,ViewHolder容纳并处理视图,但是RecyclerView 自己不创建ViewHolder。这个任务实际是由adapter来完成的。adapter是个控制器对象,从模型层获取数据,然后提供给RecyclerView 显示,起到了沟通的桥梁作用。
public class ****Fragment extends Fragment {
...
private class ***Holder extends RecyclerView.ViewHolder {
//变量存放列表项中的组件
public **Holder(View itemView) {
super(itemView);
//得到视图中的组件
}
}
private class **Adapter extends RecyclerView.Adapter<CrimeHolder> {
//变量 存放模型层的数据集合
public **Adapter(List<***> ***) {
//参数中存储在变量中
}
@Override
public **Holder onCreateViewHolder(ViewGroup parent, int viewType) {
//创建View对象,作为参数传给**Holder,然后返回这个holder
}
@Override
public void onBindViewHolder(**Holder holder, int position) {
//通过position在存储数据集合的模型中得到 数据的实例
//通过调用holder中的组件,将数据的内容显示在组件上
}
@Override
public int getItemCount() {
//return 集合.size();
}
}
}
RecyclerView需要新的View视图来显示列表项时,会调用onCreateViewHolder方法。
onBindViewHolder方法会把 ViewHolder 的 View 视图和模型层数据绑定起来。
第五步,在Fragment中 将Adapter和RecyclerView关联起来,最好使用一个方法封装起来
//得到数据类集合的单例 并用list存储起来
mAdapter = new **Adapter( 数据集合 );
m**RecyclerView.setAdapter(mAdapter);
第六步,视图已经可以显示了,接下来是在Holder中设置监听器
private class CrimeHolder extends RecyclerView.ViewHolder
implements View.OnClickListener {
public **Holder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
//列表项点击事件,do something
}
}

浙公网安备 33010602011771号