RecycleView初尝试

2024-08-28 11:32
文章标签 尝试 recycleview

本文主要是介绍RecycleView初尝试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近上了Study Jams的课程,布置了一个小作业。为了完成小作业,自己就顺便尝试用了一下RecycleView。

从整体上看RecyclerView的架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人惊艳的效果。

  • 控制其排列显示的方式,通过布局管理器LayoutManager(抽象类,系统提供了3个实现类)
  • 控制Item间的间隔(可绘制),通过ItemDecoration(抽象类,需自己实现类)
  • 控制Item增删的动画,通过ItemAnimator(抽象类,系统提供了1个实现类)
  • 控制点击、长按事件,需要自己写
  • 自己实现RecycleView.Adapter<ViewHolder>

需要先添加依赖

compile 'com.android.support:recyclerview-v7:23.2.1'

1、LayoutManager

这是一个抽象类,好在系统提供了3个实现类:

  1. LinearLayoutManager 线性布局管理器,支持横向、纵向。
  2. GridLayoutManager 网格布局管理器,支持横向、纵向。
  3. StaggeredGridLayoutManager 瀑布就式布局管理器,支持横向、纵向。
        mRecyclerView.setHasFixedSize(true);//如果可以确定每个item的高度是固定的,设置这个选项可以提高性能RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);//可以设置滚动的方向,默认竖直滚动mRecyclerView.setLayoutManager(layoutManager);mRecyclerView.setAdapter(mAdapter);
        GridLayoutManager layoutManager =new GridLayoutManager(this,3);//3行layoutManager.setOrientation(OrientationHelper.HORIZONTAL);//水平mRecyclerView.setLayoutManager(layoutManager);mRecyclerView.setAdapter(mAdapter);
        StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, OrientationHelper.VERTICAL);//表示2列,并且是竖直方向的瀑布流mRecyclerView.setLayoutManager(layoutManager);mRecyclerView.setAdapter(mAdapter);


2、ItemDecoration

抽象类,需自己实现类

ItemDecoration的一个实现类例子

//通过以下方法添加分割线
mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL_LIST));
DividerItemDecoration需要继承RecyclerView.ItemDecoration这个抽象类实现一些方法 。有点麻烦,但是可以自定义自己的分割线。如果想简单一点可以直接在item_view里面底部自己添加一根线布局,这样就无需重写了。如下:
<Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="#8F8F8F"/>

3、ItemAnimator

也是一个抽象类,好在系统为我们提供了一种默认的实现类DefaultItemAnimator()。

// 设置item动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());

更新数据集不是用adapter.notifyDataSetChanged()而是notifyItemInserted(position)notifyItemRemoved(position)

RecyclerView.Adapter和BaseAdapter相比,额外提供了一下这些方法:

// 数据发生了改变,那调用这个方法,传入改变对象的位置。
public final void notifyItemChanged(int position);
// 可以刷新从positionStart开始itemCount数量的item了
public final void notifyItemRangeChanged(int positionStart, int itemCount);
// 对象从fromPosition移动到toPosition 
public final void notifyItemMoved(int fromPosition, int toPosition); 
//批量添加 
public final void notifyItemRangeInserted(int positionStart, int itemCount);
//批量删除
public final void notifyItemRangeRemoved(int positionStart, int itemCount);

4、点击事件

你可以通过mRecyclerView.addOnItemTouchListener去监听然后去判断手势, 也可以通过adapter中自己去提供回调。

这里使用第二种,使用接口回调的方法。

在Adapter类中添加以下的接口:

    public interface OnRecyclerViewItemClickListener {void onItemClick(View view, int position);void onItemLongClick(View view, int position);}private OnRecyclerViewItemClickListener mOnItemClickListener = null;public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {this.mOnItemClickListener = listener;}
在Adapter类中的onBindViewHolder()方法回调接口
        //点击事件回调if(mOnItemClickListener != null){holder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mOnItemClickListener.onItemClick(holder.itemView,position);}});//longClickholder.itemView.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {mOnItemClickListener.onItemLongClick(holder.itemView,position);return false;}});}
在需要实现RecycleView点击事件的类中实现接口
mAdapter.setOnItemClickListener(this);

5、RecycleView.Adapter<ViewHolder>

需要一个继承自RecyclerView.Adapter的适配器,作用是将数据与每一个item的界面进行绑定。主要实现三个方法:

  1. getItemCount 这个不用说,获取总的条目数
  2. onCreateViewHolder 创建ViewHolder
  3. onBindViewHolder 将数据绑定至ViewHolder

我们创建的ViewHolder必须继承RecyclerView.ViewHolder,这个RecyclerView.ViewHolder的构造时必须传入一个View,这个View相当于我们ListView getView中的convertView (即:我们需要inflate的item布局需要传入)。还有一点,ListView中convertView是复用的,在RecyclerView中,是把ViewHolder作为缓存的单位了,然后convertView作为ViewHolder的成员变量保持在ViewHolder中,也就是说,假设屏幕显示10个条目,则会创建10个ViewHolder缓存起来,每次复用的是ViewHolder,所以他把getView这个方法变为了onCreateViewHolder。

//自定义的ViewHolder,持有每个Item的的所有界面元素
class ViewHolder extends RecyclerView.ViewHolder {ImageView mAvatar;TextView mName;public ViewHolder(View view) {super(view);mAvatar = (ImageView) view.findViewById(R.id.img_avatar);mName = (TextView) view.findViewById(R.id.txt_name);}
}



例子源码


好文推荐


这篇关于RecycleView初尝试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1114644

相关文章

概率DP (由一道绿题引起的若干问题。目前为一些老题,蒟蒻的尝试学习1.0)

概率DP: 利用动态规划去解决 概率 期望 的题目。 概率DP 求概率(采用顺推) 从 初始状态推向结果,同一般的DP类似,只是经历了概率论知识的包装。 老题: 添加链接描述 题意: 袋子里有w只白鼠,b只黑鼠,A和B轮流从袋子里抓,谁先抓到白色谁就赢。A每次随机抓一只,B每次随机 抓完一只后 会有另外一只随机老鼠跑出来。如果两个人都没有抓到白色,那么B赢。A先抓,问A赢得概率。 w b 均在

重复采样魔法:用更多样本击败单次尝试的最强模型

这篇文章探讨了通过增加生成样本的数量来扩展大型语言模型(LLMs)在推理任务中的表现。 研究发现,重复采样可以显著提高模型的覆盖率,特别是在具有自动验证工具的任务中。研究还发现,覆盖率与样本数量之间的关系可以用指数幂律建模,揭示了推理时间的扩展规律。尽管多数投票和奖励模型在样本数量增加时趋于饱和,但在没有自动验证工具的任务中,识别正确样本仍然是一个重要的研究方向。 总体而言,重复采样提供了一种

尝试用java spring boot+VUE3实现前后端分离部署(8/31)

前言         这几天开学了,公司这边几个和学校对接的项目都挺忙的,然后我又开始有点闲的情况了。问大佬能不能继续看看若依的项目,大佬让我自己去学了。在看若依的项目的时候在想,python的FLASK后端实现和JAVA spring boot的实现差别大不大,两者实现的思路估计大差不差,那具体的代码逻辑和代码实现又有多大差别,java面向对象的编程思想又是怎么体现的。这些想法迫使我将原来使用

尝试制作和使用lib与dll

前言 关于lib和dll这两种库的概念,网上已有很多讨论可以参阅。这篇博客主要记录我动手尝试用VS来制作lib和dll并随后使用的过程。 参考: lib和dll的区别与使用 - LuckyAnnika - 博客园 C++编写一个简单的DLL - _No.47 - 博客园 dumpbin工具 在开始之前,需要介绍一下VS提供的dumpbin工具,这个工具可以获取一些lib与dll中的信息。 它

【UE4源代码观察】尝试调试UBT

前言 在之前的博客《【UE4源代码观察】手动建立一个使用UBT进行编译的空白工程》中我尝试动手搭建了一个用UBT进行编译的空白的工程。但是对UBT其中的逻辑并不理解。 后来在学习UE4源代码的过程中,又了解了它的一些行为。目前,对我影响较大的是:1.他会有一些逻辑去添加一些宏。2.他会有一些逻辑去给修改ModuleRules(和.build.cs中内容的角色一样)。这时候我发现一些和预期不太一

尝试进入Vulkan的ValidationLayer中的代码调用栈

问题 当前,我遇到了一个Vulkan中的错误断点: (可以看到最后的位置是“VkLayer_khronos_validation.dll”,即Validation Layer) 这个中断可以在工程YaksueGraphics的这个提交中复现: 当我双击最后的栈时,提示没有cpp文件可供查看 这个core_validation.cpp是Validation Layer中的代码,而对于V

UE4尝试用C++创建蓝图并添加变量

目标 使用C++创建蓝图资源,并尝试给蓝图添加变量。 (引擎版本4.26) 步骤0. 创建测试用插件 使用编辑器工具栏按钮为模板创建插件。 使用这个模板的理由是它初始会有个按钮,可以用来触发操作: 之后将会替换这其中所触发的操作。 步骤1. 创建蓝图 对KismetEditorUtilities.h进行include,因为创建蓝图需要用到其中的方法: #include"Kismet

【数据分析案例】使用机器学习做游戏留存数据挖掘的一种尝试

案例来源:@深极智能 案例地址: https://zhuanlan.zhihu.com/p/31213553 1. 目标:针对K游戏数据,预测玩家留存情况,并找出影响留存的因素 2. 数据:玩家id,动作,动作时间戳,玩家关键属性(金币、装备、等级等) 3. 数据清洗: 1)剔除操作数<16的玩家,这类对游戏题材不感兴趣,非目

vs2013调用opencv时项目显示 无法启动此程序,因为计算机中丢失opencv_core249.dll。请尝试重新安装改程序

Problem: 重装系统之后,重装了vs2013,配置完opencv之后,debug居然不行显示的错误如下: 一直认为是环境配置不对,重新配置了环境,再运行时,竟然显示的还是这个错误,当时就怒了,后来以为是opencv库里面的dll文件丢失,但是可惜并不是

解决RecycleView 嵌套 RecycleView 显示不全的问题

RecycleView 嵌套 RecycleView,里面的RecycleView 内容显示不全。 原因是里面的RecycleView ,我在布局里面写的高度是match_parent <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"android