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

[操作系统]Android自学历程—RecyclerView的使用(2)

Introduction to RecyclerView

RecyclerView在Android 5中被介绍,在 Support-V7的包中。她允许展示items在随意任何之处(可联想ListView),正如包名所说的,在API7以上均可使用(Android 22).

 

她的名字来自于其工作的方式,当一个Item被隐藏时,不是去destroyed她并且随后为每一个新new出来的对象去创建一个新的item,隐藏的item被回收:她们被重用,并且会有新的数据绑定她们。

 

一个RccyclerView被分为6个主要的组件:

an Adpter,提供数据(类似Listview的)

an ItemAnimator, 负责items的修改,增加,删除,移动的动画效果

an ItemDecoration, Which can add drawings or change the layout of an item

an Layoutmanage,指定Items的布局

an ViewHolder, 每一个Items View的基类

the RecyclerView本身, 把所有的绑定

 

在support-V7包中,一些组件已经绑定了默认的实现方式。你有一个ItemAnimator和三个Layoutmanage可以玩玩。RecyclerView不需要修改,并且ItemDecoration是可选的,留给我们的还有Adpter和ViewHolder。

 

Display a RecyclerView

1.Prepare your project

  add to your dependenceies:

     RecyclerView: compile 'com.android.support:recyclerview-v7:22.2.1'

     CardView:    compile 'com.android.support:cardview-v7:22.2.1'

 

2.The bass item

我们写一个简单的list,每一个items里包含一个 title 和 一个 subtitle。

 1 public class Item{ 2   private String title; 3   private String subtitle; 4    5   public Item(String title,String subtitle){ 6       this.title = title; 7       this.subtitle = subtitle; 8   } 9   10   public String getTitle(){11       return title;12   }13   14   public String getSubtitle(){15       return subtitle;16   }17 }

3.Item layout

我们的items用CardView来展示。一个 CardView就是修饰过的 FrameLayout,因此有两个TextView的展示是非常简单的。

 1 <??> 2 <android.support.v7.widget.CardView 3   ="http://schemas.android.com/apk/res/android" 4   ="http://schemas.android.com/apk/res-auto" 5   android:layout_width="match_parent" 6   android:layout_height="match_parent" 7   app:contentPadding="8dp" 8   app:cardUseCompatPadding="true"> 9 10   <LinearLayout11     android:layout_width="match_parent"12     android:layout_height="match_parent"13     android:orientation="vertical">14 15     <TextView16       android:id="@+id/title"17       android:layout_width="match_parent"18       android:layout_height="wrap_content"19       android:singleLine="true"20       style="@style/Base.TextAppearance.AppCompat.Headline"/>21 22     <TextView23       android:id="@+id/subtitle"24       android:layout_width="match_parent"25       android:layout_height="0dp"26       android:layout_weight="1"27       style="@style/Base.TextAppearance.AppCompat.Subhead"/>28 29   </LinearLayout>30 31 </android.support.v7.widget.CardView>

 

4.The adapter

第一步是定义我们自己的 ViewHolder 类。她必须继承 RecycleView.ViewHolder, 并且应该存储,当绑定你的数据到holder上,你所需要的用到的View。(翻译的太差了)(原句:and should store references to the Views you will need when binding your data on the holder .)这里我们有2个textview。

 1 public class MyAdapter extents RecyclerView.Adaper<>{ 2   private static final String TAG = MyAdapter.class.getSImpleName(); 3    4   public static class MyViewHolder extents RecyclerView.Viewholder{ 5       TextView title; 6       TextView subtitle; 7      8       public MyViewHolder(View itemView){ 9         super(itemView);10       11         title = (TextView)itemView.findViewById(R.id.title);12         subtitle = (TextView) itemView.findViewById(R.id.subtitle);13       }14   }15 }

现在,什么是存储对象的集合的最简单的方法? 对,就是 Collect。 在这个例子里,写简单的方法,我们存储我们的items(对象的集合)在ArrayList,在MyAdaper.java类里。

private List<Item> items;  private static final int ITEM_COUNT = 50;  public Myadapet() {    Random random = new Random();    items = new ArrayList<>();    for (int i = 0; i < ITEM_COUNT; i++) {      items.add(new Item("Item:" + i, "this is the item number " + i, random.nextBoolean()));    }  }

 

之后我们要实现真正的 RecyclerView.Adaper的方法:

  • onCreateViewHolder(ViewGroup viewGroup,int viewType)应该创造View,并且返回一个匹配的 ViewHolder,

  • OnBindViewHolder(ViewHolder holder,int position)应该利用 根据position获取item里的数据来填充ViewHolder,

  • getItemCount()应该给items的数量

 

在我们的栗子中,实现方式 还是比较简单的

 1 @Override 2   public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 3  4     View v = LayoutInflater.from(viewGroup.getContext()).inflate(layout, viewGroup, false); 5     return new ViewHolder(v); 6   } 7  8 @Override 9   public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {10     final Item item = items.get(i);11     ViewHolder myViewHolder = (ViewHolder) viewHolder;12     myViewHolder.title.setText(item.getTitle());13     myViewHolder.subtitle.setText(item.getSubtitle())14   }15 16   @Override17   public int getItemCount() {18     return items.size();19   }

 

5.Bind everything together

我们已经定义了我们所需要的东西。见证奇迹的时刻。

第一步:添加一个 RecyclerView到 Activity:

<RelativeLayout ="http://schemas.android.com/apk/res/android"  ="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  tools:context=".MainActivity">  <android.support.v7.widget.RecyclerView    android:id="@+id/recyclerView"    android:layout_width="match_parent"    android:layout_height="match_parent"/></RelativeLayout>

 

我们使用简单的 LinearlayoutManger.我们也会使用简单的 DefaultItemAnimator.

 1 package com.ryan.recycleviewdemo02; 2  3 import android.support.v7.app.AppCompatActivity; 4 import android.os.Bundle; 5 import android.support.v7.widget.DefaultItemAnimator; 6 import android.support.v7.widget.GridLayoutManager; 7 import android.support.v7.widget.LinearLayoutManager; 8 import android.support.v7.widget.RecyclerView; 9 import android.view.Menu;10 import android.view.MenuItem;11 12 public class MainActivity extends AppCompatActivity {13 14   private static String TAG = MainActivity.class.getSimpleName();15 16   private RecyclerView recyclerView;17 //  private RecyclerView.LayoutManager layoutManager;18 //  private RecyclerView.Adapter adapter;19 20   @Override21   protected void onCreate(Bundle savedInstanceState) {22     super.onCreate(savedInstanceState);23     setContentView(R.layout.activity_main);24 25     recyclerView = (RecyclerView) findViewById(R.id.recyclerView);26     recyclerView.setAdapter(new Myadapet());27     recyclerView.setItemAnimator(new DefaultItemAnimator());28     recyclerView.setLayoutManager(new LinearlayoutManger(this));29 30   }31 32 }

 

效果图:

上方颜色效果,后续再说。

 

到这里 就是基本的 RecyclerView的展示。后续…………

 

翻译加个人理解: www.enoent.fr/blog/2015/01/18/recyclerview-basics/,

谢谢。