zoukankan      html  css  js  c++  java
  • Android学习—RecyclerView的使用(2)

    【转自】http://www.cnblogs.com/ryan-ys/p/4741088.html

    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 <?xml version="1.0" encoding="utf-8"?>
     2 <android.support.v7.widget.CardView
     3     xmlns:android="http://schemas.android.com/apk/res/android"
     4     xmlns:app="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     <LinearLayout
    11         android:layout_width="match_parent"
    12         android:layout_height="match_parent"
    13         android:orientation="vertical">
    14 
    15         <TextView
    16             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         <TextView
    23             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     @Override
    17     public int getItemCount() {
    18         return items.size();
    19     }
    复制代码

    5.Bind everything together

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

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

    复制代码
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="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     @Override
    21     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/,

    谢谢。

    温故而知新,可以为师矣。
  • 相关阅读:
    OSX: 私人定制Dock默认程序图标
    PHP+MYSQL分页原理
    Python 数据结构与算法 —— 哈弗曼树
    C#制作文本转换为声音的demo,保存音频文件到本地
    时区与时间(二)
    时区与时间(二)
    摄影的艺术
    摄影的艺术
    名词、文化概念的解释
    名词、文化概念的解释
  • 原文地址:https://www.cnblogs.com/qiwenhui/p/android-recyclerview2.html
Copyright © 2011-2022 走看看