你的位置:首页 > 操作系统

[操作系统]安卓开发之RecyclerView

RecyclerView是一个非常好用的控件,它的效果和ListView很相似,甚至可以说RecyclerView的出现是来取代ListView的

RecyclerView比ListView更加灵活,具有更高的扩展性

下面就详细的介绍RecyclerView的用法

既然RecyclerView上来取带ListView的那说明RecyclerView和ListView的用法很相似,事实确实这样,也就是两个东西,一个控件和适配器(Adapter)

一:导包

我这里开发使用的AndroidStudio,再使用RecyclerView之前要先引入RecyclerView的包(这个是必须的,也是不用解释的)

在build文件中找到dependencies代码块,添加compile 'com.android.support:recyclerview-v7:23.0.0'这句话,重新构建项目就可以使用RecyclerView了

dependencies {  compile fileTree(include: ['*.jar'], dir: 'libs')  compile 'com.android.support:recyclerview-v7:23.0.0'}

二:写

做完上面的工作就可以开始写代码了,首先创建一个Activity同时生成

<RelativeLayout 

再写上面的代码是RecyclerView的时候不能直接写RecyclerView,必须加上前面的android.support.v7.widget,如果记不起前面的内容,给你说一种简便方法,现在Activity中声明一个变量RecyclerView

 

可以看到声明了RecyclerView之后上面的import就会自动生成,import后面的内容就是RecyclerView的全路径了。

三:写适配器类

首先创建一个类继承自RecyclerView.Adapter

相信在ListView中已经很熟悉ViewHolder这个类了,在RecyclerView的Adapter中ViewHolder内置了,所以先不要管什么,必须先写一个ViewHolder内部类继承自RecyclerView.ViewHolder,重写构造函数,这个时候先不要急实现Adapter的抽象方法

public class MyRecyclerViewAdapter extends RecyclerView.Adapter {    class MyViewHolder extends RecyclerView.ViewHolder{    public MyViewHolder(View itemView) {      super(itemView);    }  }}

做完上面的再去将我们写的ViewHolder给Adapter绑上,就是RecyclerView.Adapter后面尖括号的内容

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {  class MyViewHolder extends RecyclerView.ViewHolder{    public MyViewHolder(View itemView) {      super(itemView);    }  }}

昨晚上面的步骤再去实现Adapter的抽象方法

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {  @Override  public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {    return null;  }  @Override  public void onBindViewHolder(MyViewHolder myViewHolder, int i) {  }  @Override  public int getItemCount() {    return 0;  }  class MyViewHolder extends RecyclerView.ViewHolder{    public MyViewHolder(View itemView) {      super(itemView);    }  }}

如果先去实现了上面的抽象方法,不先做上面的步骤你会很麻烦,甚至可能会思维混乱不知所措

这样这个Adapter类基本成型了,下面来介绍这些方法的作用

首先onCreateViewHolder()这个方法看名字就知道是用来创建ViewHolder类的,上面虽然写出了ViewHolder类但是还没有生成实例,也就是new的过程所以这个方法就是用来new ViewHolder的,看myViewHolder有一个构造方法,构造方法里面有一个View的对象,所以在这里创建ViewHolder的时候要传入一个参数,这里的这个View很简单就是你RecyclerView的每一项的View的对象,用LayoutInflater加载,最后返回ViewHolder

其次onBinderViewHolder();这里面有两个参数MyViewHolder myViewHolder 你生成的ViewHolder实例, int i 代表目前是哪一行,所以这个方法是来给ViewHolder里面的控件赋值的

再看getItemCount();就是确定你这个RecyclerView有多少行

MyViewHolder是初始化每一行空间的地方

将上面的方法都实现就形成了下面的Adapter类

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {  private List<String> mList;  private Context context;  public MyAdapter(List<String> mList,Context context){    this.mList = mList;    this.context = context;  }  @Override  public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {    View view = LayoutInflater.from(context).inflate(R.layout.item,viewGroup,false);    MyViewHolder viewHolder = new MyViewHolder(view);    return viewHolder;  }  @Override  public void onBindViewHolder(MyViewHolder myViewHolder, int i) {    myViewHolder.tv_msg.setText(mList.get(i));  }  @Override  public int getItemCount() {    return mList.size();  }  class MyViewHolder extends RecyclerView.ViewHolder{    TextView tv_msg;    public MyViewHolder(View itemView) {      super(itemView);      tv_msg = (TextView) itemView.findViewById(R.id.tv_msg);    }  }}  

四:最后Activity里面的内容 

在Activity里面的内容就很简单了,也就是setAdapter了,值得提提的是除了设置Adapter,在RecyclerView里面有一个LayoutManager的东西,这也是RecyclerView扩展性高的主要原因

代码如下

public class MainActivity extends Activity {  private RecyclerView recyclerView;  private List<String> mList ;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    initView();    function();  }  private void function() {    mList = new ArrayList<>();    for (int i = 0 ; i < 20 ; i++){      mList.add("Hello"+i);    }    MyAdapter adapter = new MyAdapter(mList,this);    LinearLayoutManager llm = new LinearLayoutManager(this,0,false);    recyclerView.setLayoutManager(llm);    recyclerView.setAdapter(adapter);  }  private void initView() {    recyclerView = (RecyclerView) findViewById(R.id.recyclerView);  }}

解释一下,首先通过findViewById找到RecyclerView

然后初始化List

然后生成Adapter实例

接下来生成LayoutManager的对象

最后设置LayoutManager和Adapter。

五:最后

解释一下LayoutManager

RecyclerView的LayoutManager有三种,常用的有两种,这里接介绍下常用的两种

第一种LinearLayoutManager

这个一看就知道线性布局管理,构造方法有三个参数,第一个上下文对象(不描述),第二个是一个int型的参数(只能是0和1)0代表横向,1代表纵向,第三个参数Boolean表示顺序还是倒序

false代表顺序,true代表倒序;这种布局管理器的效果和ListView的效果是一样的一行只能放一个item

第二种GridLayoutManager

这个一看就知道是网格布局管理器,也就是说用这种管理器可在一行放多个item,它有两个参数;第一个上下文对象化,第二个int型表示一行放的item的个数(1:表示一行放一个item;2:表示一行放2个item)