Android更强大的滚动控件RecyclerView(详解)

一.RecyclerView的基本用法

  1.简介

         RecyclerView是Android5.0后谷歌推出的一个用于在有限的窗口中展示 大量数据集的控件,它可以称为增强版的listview。不仅可以轻松实现和 listview一样的效果,同时又优化了listview的不足之处。

  2.特点

1、支持局部刷新。

2、可以自定义item增删时的动画。

3、能够实现item拖拽和侧滑删除等功能。

4、默认已实现View的复用,而且回收机制更加完善。

  3.基本用法

      1、首先要在app/build.gradle文件中添加依赖库:

Comple/Implementation ‘com.android.support:recyclerview-v7:24.2.1’

       2.自定义适配器

        使用时需要新建FruitAdapter类,该类继承于RecyclerView.Adapter, 其中VH是我们创建的一个继承于RecyclerView.ViewHolder的静态内部类 该适配器类主要有3个方法和1个自定义ViewHolder组成:

(1)onCreateViewHolder: 创建ViewHolder并返回,后续item布局里控件都是从 ViewHolder中取出。                                                                                                              (2)onBindViewHolder:通过方法提供的ViewHolder,将数据绑定到ViewHolder中。               (3)getItemCount:获取数据源总长度。

使用方法:recycleview.setAdapter(adapter)

     3.LayoutManager(布局管理器)

     通过不同的布局管理器来控制item的排列顺序,负责item元素 的布局和复用。RecyclerView提供了三种布局管理器:

• LinearLayoutManager:线性布局,以垂直戒水平滚动列表方式 显示项目。

• GridLayoutManager:网格布局,在网格中显示项目。

• StaggeredGridLayoutManager:瀑布流布局,在分散对齐网格 中显示项目

 

  4.代码部分

     1 、案例效果

     2 、类文件 MainActivity.java 代码:

package com.example.recyclerview1;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
     //第一步:定义对象
     RecyclerView recyclerView;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         //第二步:绑定控件
         recyclerView=findViewById(R.id.recyclerview);
         //第三步:准备数据
         List<Fruit> fruitlist=new ArrayList<>();
         for (int i = 0; i <2 ; i++) {
             Fruit pineapple = new Fruit(R.drawable.pineapple, "菠萝", "¥16.9元/kg");
             fruitlist.add(pineapple);
             Fruit mango = new Fruit(R.drawable.mango, "芒果","¥29.9 元/kg");
             fruitlist.add(mango);
             Fruit pomegranate = new Fruit(R.drawable.pomegranate, "石榴","¥15元/kg");
             fruitlist.add(pomegranate);
             Fruit grape = new Fruit(R.drawable.grape, "葡萄","¥19.9 元/kg");
             fruitlist.add(grape);
             Fruit apple = new Fruit(R.drawable.apple, "苹果","¥20 元/kg");
             fruitlist.add(apple);
             Fruit orange = new Fruit(R.drawable.orange, "橙子","¥18.8 元/kg");
             fruitlist.add(orange);
             Fruit watermelon = new Fruit(R.drawable.watermelon, "西瓜","¥28.8元/kg");
             fruitlist.add(watermelon);
         }
         //第四步:设计每一行的子布局
         //第五步:创建适配器
         FruitAdapter adapter=new FruitAdapter(fruitlist);
         //第六步:将数据以垂直线性布局的方式显示出来
         LinearLayoutManager layoutManager=new LinearLayoutManager(this);
         recyclerView.setLayoutManager(layoutManager);
         recyclerView.setAdapter(adapter);
     }
}

     3 、类文件 Fruit.java 代码参考:

package com.example.recyclerview1;
public class Fruit {
     private int imageID;
     private String name;
     private String price;
     public int getImageID() {
         return imageID;
     }
     public String getName() {
         return name;
     }
     public String getPrice() {
     return price;
     }
     public Fruit(int imageID, String name, String price) {
         this.imageID = imageID;
         this.name = name;
         this.price = price;
     }
}

     4 、布局界面 fruit_item.xml 代码参考:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:orientation="horizontal"
     android:layout_height="wrap_content">
     <ImageView
         android:id="@+id/fruit_image"
         android:src="@drawable/apple"
         android:layout_width="100dp"
         android:layout_height="80dp"/>
     <TextView
         android:id="@+id/fruit_name"
         android:layout_gravity="center_vertical"
         android:textSize="30sp"
         android:textColor="#000000"
         android:text="name"
         android:layout_marginLeft="10dp"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
     <TextView
         android:id="@+id/fruit_price"
         android:layout_gravity="center_vertical"
         android:textColor="#ff0000"
         android:text="price"
         android:textSize="30sp"
         android:layout_marginLeft="10dp"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
</LinearLayout>

     5 、类文件 FruitAdapter.java 代码参考:

package com.example.recyclerview1;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
//1、将泛型指定为 FruitAdapter.ViewHolder
//2、按下 alt+enter 重写三种方法
//3、鼠标放在 ViewHolder 上,按下 alt+enter 创建 ViewHolder 类
//4、ViewHolder 类继承自 RecyclerView.ViewHolder,按下 alt+enter 创建构造方法
//5、鼠标放在 FruitAdapter 类中,按下 alt+insert 添加构造方法
public class FruitAdapter extends 
RecyclerView.Adapter<FruitAdapter.ViewHolder> {
     private List<Fruit> mFruitlist;
         public FruitAdapter(List<Fruit> fruitList) {
             mFruitlist=fruitList;
     }
     //方法 1:创建 ViewHolder 实例,将加载出来的布局传入到构造函数中,最后将ViewHolder 实例返回
     @NonNull
     @Override
     public FruitAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
         View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,parent,false);
         ViewHolder holder=new ViewHolder(view);
         return holder;
 }
     //方法 2:每个子项滚动到屏幕内执行,通过 positon 得到当前项的实例,然后显示图片和文字
     @Override
     public void onBindViewHolder(@NonNull FruitAdapter.ViewHolder holder, int 
position) {
         Fruit fruit = mFruitlist.get(position);
         holder.fruitImage.setImageResource(fruit.getImageID());
         holder.fruitName.setText(fruit.getName());
         holder.fruitPrice.setText(fruit.getPrice());
     }
     //方法 3:返回数据源的长度
     @Override
     public int getItemCount() {
         return mFruitlist.size();
     }
     public class ViewHolder extends RecyclerView.ViewHolder {
         ImageView fruitImage;
         TextView fruitName;
         TextView fruitPrice;
         public ViewHolder(@NonNull View view) {
             super(view);
             fruitImage=view.findViewById(R.id.fruit_image);
             fruitName=view.findViewById(R.id.fruit_name);
             fruitPrice=view.findViewById(R.id.fruit_price);
         }
     }
}

二.实现横向滚动和瀑布流布

  1.横向滚动

     1.横向滚动案例运行效果

     2.代码

        1.2.1 布局界面 fruit_item.xml 参考代码:   

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="120dp" 
     android:orientation="vertical" 
     android:layout_height="wrap_content">
     <ImageView
         android:id="@+id/fruit_image"
         android:src="@drawable/apple"
         android:layout_gravity="left" 
         android:layout_width="100dp"
         android:layout_height="80dp"/>
     <TextView
         android:id="@+id/fruit_name"
         android:layout_marginLeft="20dp"
         android:textSize="30sp"
         android:textColor="#000000"
         android:gravity="center_horizontal" 
         android:text="name"
         android:layout_marginTop="10dp"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
     <TextView
         android:id="@+id/fruit_price"
         android:layout_gravity="center_horizontal" 
         android:textColor="#ff0000"
         android:text="price"
         android:textSize="20sp" 
         android:layout_marginTop="10dp" 
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
</LinearLayout>

         1.2.2 类文件 MainActivity.java 代码:

//6、让数据显示在 recycleView 控件上
     LinearLayoutManager layoutManager=new LinearLayoutManager(this);
       //  添加此行内容 //让布局横向排列
     layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
     recyclerView.setLayoutManager(layoutManager);
     recyclerView.setAdapter(adapter);

 

 

  2.瀑布流布

     1.瀑布流布局案例运行效果

 

 

     2.代码

         2.2.1 布局界面 fruit_item.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_margin="5dp" 
     android:orientation="vertical"
     android:layout_height="wrap_content">
     <ImageView
         android:id="@+id/fruit_image"
         android:src="@drawable/apple"
         android:layout_gravity="left"
         android:layout_width="100dp"
         android:layout_height="80dp"/>
     <TextView
         android:id="@+id/fruit_name"
         android:layout_marginLeft="15dp"
         android:textSize="30sp"
         android:textColor="#000000"
         android:gravity="center_horizontal"
         android:text="name"
         android:layout_marginTop="10dp"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
     <TextView
         android:id="@+id/fruit_price"
         android:layout_gravity="center_vertical"
         android:textColor="#ff0000"
         android:text="price"
         android:textSize="20sp"
         android:layout_marginTop="10dp"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
</LinearLayout>

         2.2.2 类文件 MainActivity.java 参考代码:

//第六步:让数据显示在 recycleview 控件中
StaggeredGridLayoutManager layoutManager=new 
StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL); 
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(adapter);

 

三.RecyclerView 的点击事件

       与ListView不同, RecyclerView并没有提供类似于 setOnItemClickListener( )这样的注册监听器方法,而是需要我们 自己给子项具体的View去注册点击事件;

       摒弃了ListView子项点击事件的监听器,所有的点击事件都有具体 的View去注册。

  1.点击事件案例运行效果

 2.代码部分

     2.1、类文件 FruitAdapter.java 参考代码:

package com.example.recyclerview3;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
public class FruitAdapter extends 
RecyclerView.Adapter<FruitAdapter.ViewHolder> {
     private List<Fruit> mFruitlist;
     public FruitAdapter(List<Fruit> fruitList) {
         mFruitlist=fruitList;
     }
     //方法 1:创建 ViewHolder 实例,将加载出来的布局传入到构造函数中,最后将ViewHolder 实例返回
     @NonNull
     @Override
     public FruitAdapter.ViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, int viewType) {
         View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,parent,false);
         final ViewHolder holder=new ViewHolder(view);
         //布局的点击事件
         holder.fruitView.setOnClickListener(new View.OnClickListener() { 
             @Override 
             public void onClick(View view) { 
                 int position=holder.getAdapterPosition(); 
                 Fruit fruit=mFruitlist.get(position); 
                 Toast.makeText(view.getContext(),"您点击的布局为:"+fruit.getName(),Toast.LENGTH_LONG).show(); 
             } 
         }); 
         //图片的点击事件
         holder.fruitImage.setOnClickListener(new View.OnClickListener() { 
             @Override 
             public void onClick(View view) { 
                 int position=holder.getAdapterPosition(); 
                 Fruit fruit=mFruitlist.get(position); 
                 Toast.makeText(view.getContext(),"您点击的图片为:"+fruit.getName(),Toast.LENGTH_SHORT).show(); 
             } 
         });
         return holder;
     }
     //方法 2:每个子项滚动到屏幕内执行,通过 positon 得到当前项的实例,然后显示图片和文字
     @Override
     public void onBindViewHolder(@NonNull FruitAdapter.ViewHolder holder, int position) {
         Fruit fruit = mFruitlist.get(position);
         holder.fruitImage.setImageResource(fruit.getImageID());
         holder.fruitName.setText(fruit.getName());
         holder.fruitPrice.setText(fruit.getPrice());
     }
     //方法 3:返回数据源的长度
     @Override
     public int getItemCount() {
         return mFruitlist.size();
     }
     public class ViewHolder extends RecyclerView.ViewHolder {
//添加了 fruitView 变量来保存子项最外层布局的实例
         View fruitView; 
         ImageView fruitImage;
         TextView fruitName;
         TextView fruitPrice;
         public ViewHolder(@NonNull View view) {
             super(view);
             fruitView=view;
             fruitImage=view.findViewById(R.id.fruit_image);
             fruitName=view.findViewById(R.id.fruit_name);
             fruitPrice=view.findViewById(R.id.fruit_price);
         }
     }
}

四.总结

 

五.参考文献

点击免费下载

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
如果想要实现一个类似于 Android 官方的 RecyclerView 控件,可以使用以下步骤: 1. 添加依赖库 在项目的 build.gradle 文件中添加以下依赖库: ```groovy implementation 'androidx.recyclerview:recyclerview:1.1.0' ``` 2. 创建布局文件 创建一个 RecyclerView 布局文件,例如: ```xml <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 3. 创建适配器 创建一个适配器来管理 RecyclerView 中的数据和视图。您可以扩展 `RecyclerView.Adapter` 类并实现以下方法: ```java public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private List<String> mData; public MyAdapter(List<String> data) { mData = data; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_layout, parent, false); return new MyViewHolder(view); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { String item = mData.get(position); holder.textView.setText(item); } @Override public int getItemCount() { return mData.size(); } public static class MyViewHolder extends RecyclerView.ViewHolder { TextView textView; public MyViewHolder(View itemView) { super(itemView); textView = itemView.findViewById(R.id.textView); } } } ``` 4. 设置布局管理器和适配器 在 Activity 或 Fragment 中,您需要设置一个布局管理器和适配器来控制 RecyclerView。例如: ```java RecyclerView recyclerView = findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new LinearLayoutManager(this)); List<String> data = new ArrayList<>(); data.add("Item 1"); data.add("Item 2"); data.add("Item 3"); MyAdapter adapter = new MyAdapter(data); recyclerView.setAdapter(adapter); ``` 5. 自定义滚动效果 如果您想要实现自定义的滚动效果,您可以使用 `RecyclerView.ItemDecoration` 类。例如,以下代码将在 RecyclerView 中添加一个分隔线: ```java public class DividerItemDecoration extends RecyclerView.ItemDecoration { private Drawable mDivider; public DividerItemDecoration(Context context) { mDivider = ContextCompat.getDrawable(context, R.drawable.divider); } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { int left = parent.getPaddingLeft(); int right = parent.getWidth() - parent.getPaddingRight(); int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); int top = child.getBottom() + params.bottomMargin; int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } } ``` 然后,您可以在 Activity 或 Fragment 中设置这个装饰器: ```java RecyclerView recyclerView = findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new LinearLayoutManager(this)); List<String> data = new ArrayList<>(); data.add("Item 1"); data.add("Item 2"); data.add("Item 3"); MyAdapter adapter = new MyAdapter(data); recyclerView.setAdapter(adapter); recyclerView.addItemDecoration(new DividerItemDecoration(this)); ``` 这样,您就可以实现一个类似 Android 官方的 RecyclerView 控件了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

撩得Android一次心动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值