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

    }

  }

posted @ 2017-03-09 23:39  HeLing_CC  阅读(207)  评论(0)    收藏  举报