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 <?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/,

谢谢。

时间: 2024-10-23 18:48:13

Android自学历程—RecyclerView的使用(2)的相关文章

Android自学历程—RecyclerView的使用

在网上看见有关RecyclerView的介绍,说是ListView的进阶版,官方推荐,便找来资料,耍耍. 首先挂上官方的教程,官方是最具权威和最让人信服的第一手资料. https://developer.android.com/training/material/lists-cards.html To create complex lists and cards with material design styles in your apps, you can use the RecyclerV

Android自学历程—回调函数的意思(源码+例子)

为什么会学习回调函数,那还要从线程说起.虽然以前写过一篇文章叫做“Android自学历程—多线程”,现在看看还是太年轻了. 在学习线程的时候,我试着看了看Handler的源码,于是对其中的Callback接口产生了兴趣.于是补自身不足,拿来学习学习.废话到此为止,整理思路,一起来学习. 下面这是一段Handler的源码 /** * Callback(回收) interface(界面) you can use when instantiating(例示) a Handler to avoid *

Android自学历程—ListView由简入深

前段时间学习了RecyclerView,发现对ListView有更加明显的感觉,于是决定把之前理清点思路的ListView,整理整理毕竟在5.0普及之前,ListView还是有用武之地的.一如既往的我们从简单的开始.——站在巨人的肩膀之上 译自:https://github.com/codepath/android_guides/wiki/Using-an-ArrayAdapter-with-ListView#using-a-basic-arrayadapter,可能本人理解不深,翻译偏生硬,带

Android自学历程—围住神经猫开发

学习核心内容: 1. 学会SurfaceView的绘图技巧. 2. 掌握神经猫的游戏逻辑设计. 第一阶段主要完成内容: 并且创建游戏所需的类,搭建基本的代码结构. 创建一个二维数组,用于保存游戏场景,并且将场景初始化. SurfaceView中根据场景数据,在界面中绘制点阵. 先上代码 1 package com.ryan.catchcrazycat; 2 3 /** 4 * Created by air on 15-8-1. 5 */ 6 public class Dot { 7 8 /* 9

Android自学历程—Surfaceview整理总结

这里借鉴了不少博主的劳动成果,先表示感谢.(一定要自己整理才能看的进去--) 其实这里还有个疑惑,SurfaceView与View的区别,以及如何选择使用. 涉及到画面更新的需求.一种是主动更新,另一种是被动更新.类似棋牌类游戏,需要被动的点击去触发它,完全可以采用View. 而比如罗盘,需要一直在旋转,这个时候需要一个线程去处理它.此种情况选用SurfaceView 先看看官方的解释 SurfaceView的API介绍 Provides a dedicated drawing surface

Android自学历程—OkHttp的基本使用

前段时间学习线程,想通过子线程获取网络图片,进而更新主UI界面的学习.发现大部分的Demo都是基于HttpClient的使用,但google似乎削弱了HttpClient,我甚至只能找到HttpURLConnection的相关类.没办法,只能寻找新的途径,这就是这篇译文的由来. 开始之前: 1.下载最新版本的OKHttp的Jar包,和Okio的Jar包. 2.在Android studio 中,导入Jar包. 最快捷的方式是:(但是我有时候我这样操作没用,不知道问什么,之后乖乖下载再导入Jar包

Android自学历程—Material Design的Tabs

好几天没写博客了,今天给大家带来一篇不错的译文.我照着练习了段时间,还有买了新书<android开发艺术探索>,如果好的话给大家分享分享. 用Android Material Design的方式处理Tabs Android Design Support Library这个类可以使我们更加向后兼容Androoid 2.1,去使用material design的组建.在Design support Library中,一些组建如:navigation drawer, floating action

Android自学历程—手把手教你使用OkHttp(基础篇)

安装 在使用OkHttp前,我们需要先导入OkHttp的第三方库. 我们可以在Github上找到她的项目地址: https://github.com/square/okhttp 我们可以在Android Studio中使用Gradle, 最后效果如下: 测试使用我们的OKHttp第三方库 1.第一步我们需要去创建一个 OKHttpClient 对象 OkHttpClient okHttpClient = new OkHttpClient(); 2.下一步我们还需要一个 Request 对象,她可

Android自学历程—Builder()模式

前一篇文章,在学习OKHttp的时候遇到Builder pattern,当然那时候还不知道这是Builder模式,只是觉得奇怪怎么后面跟了好多个点,后来通过了解才明白这是Android 中的建造者模式.稍微学习过android的,一定用过AlertDialog.buider,说来惭愧!当时没写博客,也就局限于会用的阶层.通过这篇,希望能更加的了解. Builder Design pattern in Java 建造者设计模式在Java中是一种创造类型的模式.例如,用来创建对象,类似如Factor