RecyccleView 详解

在谷歌的官网我们可以看到它是这样介绍的: RecyclerView  is
a more advanced and flexible version of  ListView .
This widget is a container for large sets of views that can be recycled and scrolled very efficiently. Use the  RecyclerView  widget
when you have lists with elements that change dynamically.

RecyclerView比listview更先进更灵活,对于很多的视图它就是一个容器,可以有效的重用和滚动。当数据动态变化的时候请使用它。

RecyclerView  is easy to use, because it provides:

  • A layout manager for positioning items
  • Default animations for common item operations
  • You also have the flexibility to define custom layout managers and animations for this widget.

RecyclerView使用起来很方便因为它提供:

它为item的定位提供一个layoutmanager

为item的操作提供一个缺省的animations

您还可以灵活地定义这个小部件的自定义布局管理器和动画

To use the  RecyclerView  widget, you have to specify an adapter and a
layout manager. To create an adapter, you extend the  RecyclerView.Adapter  class.
The details of the implementation depend on the specifics of your dataset and the type of views. For more information, see the  examples

below.

为了使用RecyclerVIew,你必须指定一个adapter和一个layoutmanager,为了创建一个adapter,你必须得继承RecyclerView.Adapter,详细的实现方法取决与你的数据集和你视图的类型。

Demo介绍不同于官网

这里就介绍完了下面我们就要做自己的Demo了。如果需要看官网的Demo那么请打开这里: 官方Demo

这里既然是详解那么就要与官方的Demo有不同,好了看看我们要做的效果吧。

实现图片文字按钮的混排。

首先还是看我的工程结构吧。

首先还是贴出我的main_acitivy.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >

 <!-- A RecyclerView with some commonly used attributes -->
<android.support.v7.widget.RecyclerView
  android:id="@+id/my_recycler_view"
  android:scrollbars="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent"/>
</LinearLayout>

其他几个xml就不用贴了,很简单的放了写TextVIew,ImgeView之类。

然后我们就来看看代码,首先是Bean里面的代码。

package com.androidl.bob;

/**
 * 实体包
 *
 * @author edsheng
 *
 */
public class Bean {
  public static final int Y_TYPE = 0; //view类型0
  public static final int X_TYPE = 1; //view类型2
  public static final int Z_TYPE = 2;//view 类型3
  private int type;
  private String text;

  public Bean(int type, String text) {
    super();
    this.type = type;
    this.text = text;
  }

  public int getType() {
    return type;
  }

  public void setType(int type) {
    this.type = type;
  }

  public String getText() {
    return text;
  }

  public void setText(String text) {
    this.text = text;
  }

}

然后是Adapter里面的代码:

package com.androidl.bob;

import java.util.List;

import com.example.androidl.R;

import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class RecycleAdapter extends RecyclerView.Adapter<ViewHolder> {

  private List<Bean> beans;

  public RecycleAdapter(List<Bean> beans) {
    super();
    this.beans = beans;
  }

  /**
   * 内部TextHoler
   *
   *
   *
   */
  public class TextHoler extends RecyclerView.ViewHolder {
    public TextView textView;

    public TextHoler(View textview) {
      super(textview);
      this.textView = (TextView) textview.findViewById(R.id.mytext);
    }
  }

  /**
   * iamgeHolder
   *
   * @author edsheng
   *
   */
  public class ImageHoler extends RecyclerView.ViewHolder {
    public ImageView Imageview;

    public ImageHoler(View textview) {
      super(textview);
      this.Imageview = (ImageView) textview.findViewById(R.id.myiamge);
    }
  }

  /**
   * 按钮的holder
   *
   *
   *
   */
  public class ButtonHolder extends RecyclerView.ViewHolder {
    public Button button;

    public ButtonHolder(View textview) {
      super(textview);
      this.button = (Button) textview.findViewById(R.id.mybutton);
    }
  }

  @Override
  public int getItemCount() {
    // TODO Auto-generated method stub
    return beans.size();
  }

  /**
   * 获取消息的类型
   */
  @Override
  public int getItemViewType(int position) {
    // TODO Auto-generated method stub
    return beans.get(position).getType();
  }

  /**
   * 创建VIewHolder
   */
  @Override
  public ViewHolder onCreateViewHolder(ViewGroup parent, int viewtype) {
    // TODO Auto-generated method stub
    View v = null;
    ViewHolder holer = null;
    switch (viewtype) {
    case Bean.X_TYPE:
      v = LayoutInflater.from(parent.getContext()).inflate(
          R.layout.recylce_item_x, null);
      holer = new TextHoler(v);
      break;
    case Bean.Y_TYPE:
      v = LayoutInflater.from(parent.getContext()).inflate(
          R.layout.recylce_item_y, null);
      holer = new ButtonHolder(v);
      break;
    case Bean.Z_TYPE:
      v = LayoutInflater.from(parent.getContext()).inflate(
          R.layout.recylce_item_z, null);
      holer = new ImageHoler(v);
      break;
    }

    return holer;
  }

  /**
   * 绑定viewholder
   */
  @Override
  public void onBindViewHolder(ViewHolder holder, int position) {
    // TODO Auto-generated method stub
    switch (getItemViewType(position)) {
    case Bean.X_TYPE:
      TextHoler textholer = (TextHoler) holder;
      textholer.textView.setText(beans.get(position).getText());
      break;
    case Bean.Y_TYPE:
      ButtonHolder buttonHolder = (ButtonHolder) holder;
      buttonHolder.button.setText(beans.get(position).getText());
      break;
    case Bean.Z_TYPE:
      ImageHoler imageHoler = (ImageHoler) holder;
      // imageHoler.Imageview.setImageResource(android.R.drawable.checkbox_on_background);
      break;
    }
  }
}

最后是activity的代码。

package com.androidl.bob;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import com.example.androidl.R;

public class Mainactivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);
     RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);

//		// improve performance if you know that changes in content
//		// do not change the size of the RecyclerView
//		 mRecyclerView.setHasFixedSize(true);

     //创建布局管理器
    LinearLayoutManager mLayoutManager = new LinearLayoutManager(this);
    mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    mRecyclerView.setLayoutManager(mLayoutManager);

    //初始化数据
    List<Bean> myDataset = new ArrayList<Bean>();

    myDataset.add(new Bean(Bean.Z_TYPE, "图片"));
    myDataset.add(new Bean(Bean.X_TYPE, "文字"));
    myDataset.add(new Bean(Bean.Y_TYPE, "按钮"));
    myDataset.add(new Bean(Bean.Z_TYPE, "图片"));
    myDataset.add(new Bean(Bean.X_TYPE, "shit"));
    myDataset.add(new Bean(Bean.X_TYPE, "我擦"));
    myDataset.add(new Bean(Bean.Z_TYPE, "图片"));
    myDataset.add(new Bean(Bean.Y_TYPE, "按钮"));
    myDataset.add(new Bean(Bean.Y_TYPE, "按钮"));
    myDataset.add(new Bean(Bean.X_TYPE, "文字"));
    //创建Adapter
    RecycleAdapter mAdapter = new RecycleAdapter(myDataset);
    mRecyclerView.setAdapter(mAdapter);

  }
时间: 2024-10-19 08:02:18

RecyccleView 详解的相关文章

Spring事务管理(详解+实例)

写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都

转载:DenseNet算法详解

原文连接:http://blog.csdn.net/u014380165/article/details/75142664 参考连接:http://blog.csdn.net/u012938704/article/details/53468483 本文这里仅当学习笔记使用,具体细节建议前往原文细度. 论文:Densely Connected Convolutional Networks 论文链接:https://arxiv.org/pdf/1608.06993.pdf 代码的github链接:h

MariaDB(MySQL)创建、删除、选择及数据类型使用详解

一.MariaDB简介(MySQL简介略过) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品.在存储引擎方面,使用XtraDB(英语:XtraDB)来代替MySQL的InnoDB. MariaDB由MySQL的创始人Michael Widenius(英语:Michael Widenius)主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL A

HttpServletResponse和HttpServletRequest详解

HttpServletResponse,HttpServletRequest详解 1.相关的接口 HttpServletRequest HttpServletRequest接口最常用的方法就是获得请求中的参数,这些参数一般是客户端表单中的数据.同时,HttpServletRequest接口可以获取由客户端传送的名称,也可以获取产生请求并且接收请求的服务器端主机名及IP地址,还可以获取客户端正在使用的通信协议等信息.下表是接口HttpServletRequest的常用方法. 说明:HttpServ

POSIX 线程详解(经典必看)

总共三部分: 第一部分:POSIX 线程详解                                   Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  2000 年 7 月 01 日 第二部分:通用线程:POSIX 线程详解,第 2部分       Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  20

.NET深入解析LINQ框架(五:IQueryable、IQueryProvider接口详解)

阅读目录: 1.环路执行对象模型.碎片化执行模型(假递归式调用) 2.N层对象执行模型(纵横向对比链式扩展方法) 3.LINQ查询表达式和链式查询方法其实都是空壳子 4.详细的对象结构图(对象的执行原理) 5.IQueryable<T>与IQueryProvider一对一的关系能否改成一对多的关系 6.完整的自定义查询 1]. 环路执行对象模型.碎片化执行模型(假递归式调用) 这个主题扯的可能有点远,但是它关系着整个LINQ框架的设计结构,至少在我还没有搞懂LINQ的本意之前,在我脑海里一直频

netstat状态详解

一.生产服务器netstat tcp连接状态................................................................................ 2 1.1生产服务器某个业务LVS负载均衡上连接状态数量............................................... 2 1.2生产服务器某个业务web上连接状态数量...............................................

详解go语言的array和slice 【二】

上一篇  详解go语言的array和slice [一]已经讲解过,array和slice的一些基本用法,使用array和slice时需要注意的地方,特别是slice需要注意的地方比较多.上一篇的最后讲解到创建新的slice时使用第三个索引来限制slice的容量,在操作新slice时,如果新slice的容量大于长度时,添加新元素依然后使源的相应元素改变.这一篇里我会讲解到如何避免这些问题,以及迭代.和做为方法参数方面的知识点. slice的长度和容量设置为同一个值 如果在创建新的slice时我们把

13.Linux键盘按键驱动 (详解)

版权声明:本文为博主原创文章,未经博主允许不得转载. 在上一节分析输入子系统内的intput_handler软件处理部分后,接下来我们开始写input_dev驱动 本节目标: 实现键盘驱动,让开发板的4个按键代表键盘中的L.S.空格键.回车键 1.先来介绍以下几个结构体使用和函数,下面代码中会用到 1)input_dev驱动设备结构体中常用成员如下: struct input_dev { void *private; const char *name; //设备名字 const char *ph