List and Grid
1.Using lists or grids in Android
App中使用 list 和 grid 是比较普遍的显示元素的的模式。
用户与条目的交互是通过触摸和工具栏。每一个条目被选择,可以显示个下拉框或进入一个详细的关于该条目的页面。
2. Using RecyclerView
RecyclerView 是比 ListView、GridView更现代化的版本,解决了现有小部件存在的几个问题。它实施了一种编程风格,有良好的效果;当删除或增加元素时还带有默认的动画。
Recycler view uses a ViewHolder
to store references to the views for one entry in the recycler view. A ViewHolder
class is a static inner class in your adapter which holds
references to the relevant views. With these references your code can avoid the time-consuming findViewById()
method to update the widgets with new data
3. Adapters
适配器管理数据模型,将数据适配到窗体控件中,使之成为一个个条目显示。
Adapter继承自RecyclerView.Adapter,需要重载onCreateViewHolder()、onBindViewHolder()、getItemCount()方法。
内部写一个ViewHoder类继承自ReCycleView.ViewHolder,来实现获取View的控件
public class ViewHolder extends RecyclerView.ViewHolder{ public TextView txtHeader; public TextView txtFooter; public View layout; public ViewHolder(View itemView) { super(itemView); layout = itemView; txtHeader = (TextView)itemView.findViewById(R.id.firstLine); txtFooter = (TextView)itemView.findViewById(R.id.secondLine); } }
可以通过RecyclerView.setAdapter
()来个RecyclerView指定适配器。
RecyclerView的适配器可以接受任何类型的JAVA对象。可以使用
getItemCount()
获取到适配器的条目数。
4. Gradle dependency to use recycler view
dependencies { ... compile "com.android.support:recyclerview-v7:25.3.1" }
5. Default layout manager
布局管理决定RecycleView中显示的是什么数据。RecycleView 库中包含三个内置的布局管理。
-
LinearLayoutManager shows items in a vertical or horizontal scrolling list.
-
GridLayoutManager shows items in a grid.
-
StaggeredGridLayoutManager shows items in a staggered grid.
6. Relevant implementation classes to use RecyclerView
要实现RecyclerView需要实现几个类:
8. Layouts in recycler view
注意:
写一个自己的Adapter类,该类继承自ReCycleView.Aadpter,该类是一个抽象类:public static abstract class Adapter<VH extends ViewHolder>,其中的ViewHolder也是一个抽象类所以在这个自己的Adapter类中需要写一个继承Recycle.ViewHolder的类,该类的目的主要是在构造方法中队布局中的控件进行绑定操作,见下图代码。
public class ViewHolder extends RecyclerView.ViewHolder{ public ImageView imageView; public TextView txtHeader; public TextView txtFooter; public View layout; public ViewHolder(View itemView) { super(itemView); layout = itemView; imageView = (ImageView)itemView.findViewById(R.id.imageView1); txtHeader = (TextView)itemView.findViewById(R.id.firstLine); txtFooter = (TextView)itemView.findViewById(R.id.secondLine); } }
自己的MyAdapter类还需有一个构造方法,一个参数用于传递显示的数据的值,一般用List<>类型参数来传递。
继承ReCycleView.Aadpter 则需要实现其 1)、OnCreatViewHolder(ViewGroup parent, int viewType),parent带表RecycleView实例的RootView.,在该方法中实例一个填充器。填充器从指定的布局.xml文件中填充一个新的View。再这个新的View加载控件:View为参数传给ViewHolder的方式。示例:
@Override public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater inflater = LayoutInflater.from(parent.getContext()); View view = inflater.inflate(R.layout.row_layout, parent, false); ViewHolder viewHolder = new ViewHolder(view); return viewHolder; }
2)、onBindViewHolder(MyAdapter.ViewHolder holder, int position),通过这个方法中的holder,来给每个控件赋值。实例:
public void onBindViewHolder(MyAdapter.ViewHolder holder, int position) { // - get element from your dataset at this position // - replace the contents of the view with that element String name = values.get(position); holder.txtHeader.setText(name); // holder.txtHeader.setOnClickListener(new View.OnClickListener() { // @Override // public void onClick(View v) { // remove(this.position); // } // }); // holder.imageView.setImageResource(R.drawable.ic_launcher); holder.txtFooter.setText("Footer: " + name); }
3)、getItemCount() 。通过这个方法得到条目数,内部定义:
@Override public int getItemCount() { return values.size(); }
在MainActivity中
为RecycleView 设置 LayoutManager、Adapter。
学习来源:http://www.vogella.com/tutorials/AndroidRecyclerView/article.html