Android:RecyclerView详解(ListView,GirdView,瀑布流)

客官°小女子只卖身不卖艺 2022-07-29 08:45 399阅读 0赞

一,概述

RecyclerView于2014年Google的I/O大会面世,它被作为ListView和GridView控件的继承者,在最新的support-V7版本中提供支持。
比起ListView、GridView,整体上看RecyclerView架构,提供了一种单条目删除和插入的方式,高度的解耦,异常的灵活。
顾名思义,RecyclerView代表它只管Recycler View,即RecyclerView只管回收与复用View,其他的属性可以自己去设置。可以看出其高度的解耦,给使用者充分的定制自由,扩展性极强(可以实现ListView,GirdView,瀑布流等效果)。

使用RecyclerView控件,我们需要创建一个Adapter和一个LayoutManager:

  • Adapter:继承自RecyclerView.Adapter类,主要用来将数据和布局item进行绑定。
  • LayoutManager:布局管理器,设置每一项view在RecyclerView中的位置布局以及控件item view的显示或者隐藏.

当View重用或者回收的时候,LayoutManger都会向Adapter来请求新的数据来进行替换原来数据的内容。这种回收重用的机制可以提供性能,避免创建很多的view或者是频繁的调用findViewById方法。这种机制和ListView还是很相似的。

RecyclerView提供了三种内置的LayoutManager:

  1. LinearLayoutManager:线性布局,横向或者纵向滑动列表
  2. GridLayoutManager:表格布局
  3. StaggeredGridLayoutManager:流式布局,例如瀑布流效果

当然除了上面的三种内部布局之外,我们还可以继承RecyclerView.LayoutManager来实现一个自定义的LayoutManager。

二,RecyclerView的基本实现

build.gradle中追加:

  1. dependencies { ……. compile'com.android.support:recyclerview-v7:22.2.1' }

MainActivity:

  1. package com.myapplication.recyclerviewdemo;
  2. import android.os.Bundle;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.support.v7.widget.GridLayoutManager;
  5. import android.support.v7.widget.LinearLayoutManager;
  6. import android.support.v7.widget.RecyclerView;
  7. import android.widget.GridLayout;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. /** * RecyclerView基本使用 * 步骤:1.引入依赖的包 * compile 'com.android.support:recyclerview-v7:22.2.1' * 2.在布局里面引入控件 * 3.代码里面查找控件 * 4.创建适配器,布局管理器 * 5.设置适配器 */
  11. public class MainActivity extends AppCompatActivity {
  12. private RecyclerView recyclerView;
  13. private RecyclerView.LayoutManager layoutManager;//布局管理器
  14. private List<String> list;
  15. private RecyclerViewAdapter adapter;
  16. @Override
  17. protected void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.activity_main);
  20. init();
  21. }
  22. private void init() {
  23. recyclerView = (RecyclerView) findViewById(R.id.id_recyclerView);
  24. //设定固定大小
  25. recyclerView.setHasFixedSize(true);
  26. //布局管理器
  27. layoutManager = new LinearLayoutManager(this//上下文,可以只设置这一个参数
  28. , LinearLayoutManager.VERTICAL//线性布局的显示方向
  29. , true//显示内容是否内容反转,true为反转
  30. );
  31. //网格布局管理器
  32. RecyclerView.LayoutManager layoutManagerGrid = new GridLayoutManager(this//上下文
  33. , 3//网格布局行数或者列数
  34. , GridLayout.HORIZONTAL//网格显示方向
  35. , true//显示内容是否内容反转,true为反转
  36. );
  37. //给RecyclerView设置布局管理器
  38. recyclerView.setLayoutManager(layoutManager);
  39. initData();//初始化数据
  40. adapter = new RecyclerViewAdapter(list, this);//初始化适配器
  41. recyclerView.setAdapter(adapter);
  42. }
  43. private void initData() {
  44. list = new ArrayList<>();
  45. for (int i = 'A'; i < 'z'; i++) {
  46. list.add("春风十里不如你——" + (char) i);
  47. }
  48. }
  49. }

适配器RecyclerViewAdapter中代码:

  1. package com.myapplication.recyclerviewdemo;
  2. import android.content.Context;
  3. import android.support.v7.widget.RecyclerView;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.ImageView;
  8. import android.widget.TextView;
  9. import java.util.List;
  10. /** * Created by Administrator on 2016/3/18. * 1.继承RecyclerView.Adapter<这里写holder>(一个写自己创建的,用原生的后面赋值的时候强转) * 2.实现继承之后的方法 * getItemCount显示条目个数 * onCreateViewHolder创建一个布局holder进行绑定 * onBindViewHolder数据绑定 */
  11. public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {
  12. private List<String> list;
  13. private LayoutInflater mInflater;
  14. public RecyclerViewAdapter(List<String> list, Context context) {
  15. this.list = list;
  16. mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  17. }
  18. //将布局和holder绑定
  19. @Override
  20. public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  21. //加载出Item布局
  22. View view = mInflater.inflate(R.layout.item, parent, false);
  23. //将布局设置给holder,绑定
  24. MyViewHolder holder = new MyViewHolder(view);
  25. return holder;
  26. }
  27. //为Item中每个控件设置数据
  28. @Override
  29. public void onBindViewHolder(MyViewHolder holder, int position) {
  30. holder.text.setText(list.get(position));
  31. }
  32. @Override
  33. public int getItemCount() {
  34. return list.size();
  35. }
  36. public class MyViewHolder extends RecyclerView.ViewHolder {
  37. private ImageView img;
  38. private TextView text;
  39. public MyViewHolder(View itemView) {
  40. super(itemView);
  41. img = (ImageView) itemView.findViewById(R.id.id_img_item);
  42. text = (TextView) itemView.findViewById(R.id.id_text_item);
  43. }
  44. }
  45. }

这个自定义Adapter和与Listview的Adapter相比不太一样,首先这边我们需要继承RecyclerView.Adaper类,然后实现两个重要的方法onBindViewHodler()以及onCreateViewHolder(),最重要的区别就是:使用RecyclerView控件我们就可以把Item View视图创建和数据绑定这两步进行分来进行管理,用法就更加方便而且灵活了,并且我们可以定制打造千变万化的布局。同时这边我们还需要创建一个ViewHolder类,该类必须继承自RecyclerView.ViewHolder类,现在Google也要求我们必须要实现ViewHolder来承载Item的视图。

主布局:activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <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="com.myapplication.recyclerviewdemo.MainActivity" >
  3. <android.support.v7.widget.RecyclerView android:id="@+id/id_recyclerView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scrollbars="vertical" />
  4. </RelativeLayout>

Item.xml代码:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#0aaa00" android:orientation="horizontal" >
  3. <ImageView android:id="@+id/id_img_item" android:layout_width="100dp" android:layout_height="100dp" android:src="@drawable/dengchao" />
  4. <TextView android:id="@+id/id_text_item" android:layout_width="wrap_content" android:layout_height="100dp" android:gravity="center" />
  5. </LinearLayout>

效果图如下:
这里写图片描述
上图是LinearLayout的Vertical。
设置GridLayoutManager只需要改一行代码,效果如下:

  1. //给RecyclerView设置布局管理器
  2. recyclerView.setLayoutManager(layoutManagerGrid);

这里写图片描述

瀑布流需要将Item中的控件高度随机,Adapter中代码修改:

  1. private List<Integer> heightList;
  2. public RecyclerViewAdapter(List<String> list, Context context) {
  3. this.list = list;
  4. mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  5. heightList = new ArrayList<>();
  6. for (int i = 'A'; i < 'z'; i++) {
  7. //高度设置为随机数
  8. heightList.add((int) (Math.random() * 300) + 100);
  9. }
  10. }

MainActivity中代码修改:

  1. //瀑布流布局管理器
  2. StaggeredGridLayoutManager staggeredGridLayoutManager
  3. = new StaggeredGridLayoutManager(2, OrientationHelper.VERTICAL);
  4. recyclerView.setLayoutManager(staggeredGridLayoutManager);

瀑布流效果图如下:
这里写图片描述

三,RecyclerView中Item设置监听

四,RecyclerView中Item的增删(部分刷新)

发表评论

表情:
评论列表 (有 0 条评论,399人围观)

还没有评论,来说两句吧...

相关阅读

    相关 瀑布

      什么是瀑布流? 演示效果点[这里][Link 1]。瀑布流呢,可以有多列,每一个item(单元格)的高度可以不相同,但是宽度必须一样.排列的方式是,从左往右排列,哪

    相关 瀑布

    瀑布流经过几经波折终于完成,完了就总结一下,可以帮助更多的人。(具体瀑布流布局,可百度jquery-masonry.js) 1>>首先就是一个窗口的滚动条是否接近页面底部的一

    相关 瀑布布局

    1、点击取消就刷新,防止模板不刷新导致bug 2、循环元素,if(第一排) else(其他排) 3、数组arr存放第一排高度 4、获取arr最小值height以及索