RecycleView基本用法

本文介绍了Android中RecycleView的基本用法,包括ViewHolder模式、适配器的创建及使用、布局管理器设置等内容。

接触了挺长时间的RecycleView了,也用RecycleView做过不少小东西了,但是每次用到它的时候还有些地方想不起来怎么写,然后去查书本、查博客,所以我觉得有必要为RecycleView写下点什么东西了。

首先对于RecycleView来说,如果想实现一些简单的功能,又对页面美观要求不高的话,只需知道几个点就够了

第一 RecycleView.ViewHolder

这个类一般都作为超类被一个叫做某某Holder的类继承,这个类的作用主要用来对RecycleView里面的item进行初始化,定义控件、控件获取id都需要在这个类里面写。

这个类里面只写一个构造方法,构造方法里面首先调用父类的构造方法,然后写item里面的控件获取id。如下面的代码所示:

private class SoundHolder extends RecyclerView.ViewHolder{
    private Button mButton;
    public SoundHolder(LayoutInflater inflater,ViewGroup container){
        super(inflater.inflate(R.layout.list_item_sound,container,false));
        mButton=(Button)itemView.findViewById(R.id.list_item_sound_button);
    }
}
第二 适配器

第一次听这个名字的时候感觉好高大上啊,能叫某某器,适配器其实说白了就是一个类,只是因为它的功能较为强大所以称之为某某器,又因为它为RecycleView加载数据、适配item等,就给它起了一个名字,叫适配器。

适配器这个类是RecycleView.Adapter<某某Holder> ,这里的某某Holder也就是上面定义的那个类名。适配器类也被用作超类被一个叫某某Adapter的类继承,这个类里面要实现三个方法:

(1)onCreateViewHolder(View Group parent,int ViewType)

看名字想必也都猜出来了吧,在我的理解中,这个类主要用于创建RecycleView的item

(2)onBindViewHolder(SoundHolder holder, int position)

这个类主要用于绑定数据,在这个类中,将数据设置到item里面的控件上,使用Holder找到item,使用position找到数据位置。这个先说的抽象一点,看下面的代码就明白了。

(3)getItemCount()

这个类主要返回RecycleView中要添加的item数量。RecycleView添加多少个item都是这个方法说了算。

说了这么多,先看下代码:

private class SoundAdapter extends RecyclerView.Adapter<SoundHolder>{
    @Override
    public SoundHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater=LayoutInflater.from(getActivity());
        return new SoundHolder(inflater,parent);//返回一个item,SoundHolder就是我上面定义的一个class
    }

    @Override
    public void onBindViewHolder(SoundHolder holder, int position) {
        holder.mButton.setText(datas.get(position));//为Button绑定数据,datas是一个List容器
    }

    @Override
    public int getItemCount() {
        return datas.size();//返回要添加的item个数
    }
}

只要理解各个类、方法的作用,就不难理解RecycleView。

已经为RecycleView打好基础了。然后我们要获取一个RecycleView的控件了。

RecyclerView recyclerView=(RecyclerView)v.findViewById(R.id.fragment_recycle_view);
可以忽略v.,因为我是写在Fragment上面的,所以有V.,写在Activity中直接findViewBuId。

然后我们要为这个RecycleView设置布局方式:

mCrimeRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
这里我设置为比较简单的线性布局,关于其他布局我会后续增加。

最后我们为RecycleView设置一个适配器。

recyclerView.setAdapter(new SoundAdapter());
这样一个简单的RecycleView就完成了。

<think> 我们正在讨论的是RecyclerView的使用方法。根据之前的引用,RecyclerView是一个用于展示大量数据列表的控件,它支持多种布局和动画效果。下面我将分步骤介绍RecyclerView的基本使用方法,并给出一个简单的示例代码。 ### 1. 添加依赖 首先,在build.gradle文件中添加RecyclerView的依赖(以Android为例): ```gradle dependencies { implementation 'androidx.recyclerview:recyclerview:1.2.1' } ``` ### 2. 布局文件中添加RecyclerView 在布局文件中添加RecyclerView控件,例如: ```xml <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` ### 3. 创建列表项布局 创建一个新的布局文件作为列表项的视图,例如`item_view.xml`: ```xml <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp"/> ``` ### 4. 创建适配器(Adapter) 适配器负责将数据绑定到RecyclerView的每个项上。以下是一个简单的适配器示例: ```java public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private List<String> mData; public static class MyViewHolder extends RecyclerView.ViewHolder { public TextView textView; public MyViewHolder(View itemView) { super(itemView); textView = itemView.findViewById(R.id.textView); } } 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_view, parent, false); return new MyViewHolder(view); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.textView.setText(mData.get(position)); } @Override public int getItemCount() { return mData.size(); } } ``` ### 5. 设置LayoutManager和Adapter 在Activity或Fragment中,设置RecyclerView的LayoutManager和Adapter: ```java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RecyclerView recyclerView = findViewById(R.id.recyclerView); // 设置LayoutManager,这里使用线性布局 recyclerView.setLayoutManager(new LinearLayoutManager(this)); // 准备数据 List<String> data = new ArrayList<>(); for (int i = 0; i < 100; i++) { data.add("Item " + i); } // 设置Adapter MyAdapter adapter = new MyAdapter(data); recyclerView.setAdapter(adapter); } } ``` ### 6. 运行效果 运行应用后,RecyclerView将显示一个包含100个文本项的垂直滚动列表。 ### 注意事项: - **LayoutManager**:必须设置,否则RecyclerView无法显示。常用的有`LinearLayoutManager`(线性布局)、`GridLayoutManager`(网格布局)、`StaggeredGridLayoutManager`(瀑布流布局)。 - **数据更新**:如果数据发生变化,需要调用适配器的`notifyDataSetChanged()`方法(或更精细的方法如`notifyItemInserted()`)来更新UI。 - **点击事件**:需要在适配器中为每个项设置点击事件监听器,通常是在`onBindViewHolder`方法中设置。 ### 引用说明 以上步骤参考了RecyclerView的基本使用指南[^2][^4]。 --- §§相关问题§§ 1. RecyclerView与ListView有什么区别? 2. 如何实现RecyclerView的点击事件? 3. RecyclerView如何实现不同的布局类型? 4. 如何使用RecyclerView实现网格布局? 5. RecyclerView如何添加分割线? </think> ### RecyclerView 使用方法详解 RecyclerView 是 Android 开发中用于高效展示大量数据的核心组件,相比传统的 ListView 具有更好的性能和灵活性。以下是完整的使用流程: #### 1. 添加依赖(Gradle) ```gradle dependencies { implementation 'androidx.recyclerview:recyclerview:1.3.2' // 最新稳定版 } ``` #### 2. 布局文件中声明 RecyclerView ```xml <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="vertical"/> <!-- 垂直滚动条 --> ``` #### 3. 创建列表项布局(item_layout.xml) ```xml <!-- res/layout/item_layout.xml --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="16dp"> <ImageView android:id="@+id/ivIcon" android:layout_width="48dp" android:layout_height="48dp"/> <TextView android:id="@+id/tvTitle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="18sp"/> <TextView android:id="@+id/tvSubtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#757575"/> </LinearLayout> ``` #### 4. 创建数据模型类 ```java public class ListItem { private String title; private String subtitle; private int iconResId; // 构造方法、getters/setters... } ``` #### 5. 实现适配器 (Adapter) ```java public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<ListItem> dataList; // ViewHolder 内部类 public static class ViewHolder extends RecyclerView.ViewHolder { ImageView ivIcon; TextView tvTitle; TextView tvSubtitle; public ViewHolder(View itemView) { super(itemView); ivIcon = itemView.findViewById(R.id.ivIcon); tvTitle = itemView.findViewById(R.id.tvTitle); tvSubtitle = itemView.findViewById(R.id.tvSubtitle); } } public MyAdapter(List<ListItem> dataList) { this.dataList = dataList; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_layout, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(ViewHolder holder, int position) { ListItem item = dataList.get(position); holder.ivIcon.setImageResource(item.getIconResId()); holder.tvTitle.setText(item.getTitle()); holder.tvSubtitle.setText(item.getSubtitle()); // 添加点击事件 holder.itemView.setOnClickListener(v -> { // 处理点击逻辑 }); } @Override public int getItemCount() { return dataList.size(); } } ``` #### 6. 在 Activity/Fragment 中设置 ```java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RecyclerView recyclerView = findViewById(R.id.recyclerView); // 1. 设置布局管理器 recyclerView.setLayoutManager(new LinearLayoutManager(this)); // 2. 准备数据 List<ListItem> data = new ArrayList<>(); data.add(new ListItem("标题1", "副标题1", R.drawable.icon1)); data.add(new ListItem("标题2", "副标题2", R.drawable.icon2)); // ...添加更多数据 // 3. 设置适配器 MyAdapter adapter = new MyAdapter(data); recyclerView.setAdapter(adapter); // 4. (可选) 添加分割线 recyclerView.addItemDecoration( new DividerItemDecoration(this, DividerItemDecoration.VERTICAL)); } } ``` #### 7. 高级用法示例 ```java // 网格布局(2列) recyclerView.setLayoutManager(new GridLayoutManager(this, 2)); // 瀑布流布局 recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)); // 添加动画 DefaultItemAnimator animator = new DefaultItemAnimator(); animator.setAddDuration(300); recyclerView.setItemAnimator(animator); // 下拉刷新(需添加 SwipeRefreshLayout 依赖) SwipeRefreshLayout swipeRefresh = findViewById(R.id.swipeRefresh); swipeRefresh.setOnRefreshListener(() -> { // 刷新数据 adapter.notifyDataSetChanged(); swipeRefresh.setRefreshing(false); }); ``` ### 关键组件说明 1. **LayoutManager**:控制布局样式 - `LinearLayoutManager`:线性列表(垂直/水平) - `GridLayoutManager`:网格布局 - `StaggeredGridLayoutManager`:瀑布流布局 2. **Adapter**:数据与视图的桥梁 - `onCreateViewHolder`:创建视图容器 - `onBindViewHolder`:绑定数据到视图 - `getItemCount`:返回数据总量 3. **ViewHolder**:缓存视图组件引用 4. **ItemDecoration**:添加分割线/间距 ```java recyclerView.addItemDecoration( new DividerItemDecoration(context, LinearLayoutManager.VERTICAL) ); ``` ### 性能优化技巧 1. 使用 `notifyItemChanged()` 替代 `notifyDataSetChanged()` 局部刷新 2. 在 `ViewHolder` 构造函数中预加载复杂视图 3. 开启复用池优化滚动性能: ```java recyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool()); ``` 4. 使用 `DiffUtil` 智能更新数据[^1][^2] > 实现效果:高效展示可滚动的数据列表,支持点击交互、多种布局样式和动画效果[^3][^4] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值