RecyclerView 打造简单的万能适配器Adapter(1)

安卓RecyclerView和Adapter 阅读详情
  • @param

  • @return

*/

public V getView(int viewId){

View view = mViews.get(viewId);

if (null==view){

view = itemView.findViewById(viewId);

mViews.put(viewId,view);

}

return (V) view;

}

/**

  • 创建ViewHolder

  • @param context

  • @param parent

  • @param viewType

  • @param layoutId

  • @return

*/

public static BaseViewHolder createViewHolder(Context context,ViewGroup parent, int viewType,int layoutId){

View inflate = LayoutInflater.from(context).inflate(layoutId, parent, false);

return new BaseViewHolder(context,inflate);

}

public View getContentView(){

return mContentView;

}

public BaseViewHolder setText(int viewId, String text){

TextView tv = getView(viewId);

tv.setText(text);

return this;

}

public BaseViewHolder setImageView(int viewId, int resId){

ImageView imageView = getView(viewId);

imageView.setImageResource(resId);

return this;

}

public BaseViewHolder setImageView(int viewId, Drawable resId){

ImageView imageView = getView(viewId);

imageView.setImageDrawable(resId);

return this;

}

}

2.创建条目点击事件和子条目点击事件接口

/**

  • @author LHW

  • @date 2020/11/5.

  • Description:

*/

public interface OnItemLongClickListener {

boolean onItemLongClick(@NonNull CommomBaseAdapter adapter, @NonNull View view, int position);

}

/**

  • @author LHW

  • @date 2020/11/5.

  • Description:

*/

public interface OnItemClickListener {

void onItemClickListener(@NonNull CommomBaseAdapter<?, ?> adapter, @NonNull View view, int position);

}

/**

  • @author LHW

  • @date 2020/11/5.

  • Description:

*/

public interface OnItemChildLongClickListener {

/**

  • callback method to be invoked when an item in this view has been

  • click and held

  • @param adapter this CommomBaseAdapter adapter

  • @param view The childView whihin the itemView that was clicked and held.

  • @param position The position of the view int the adapter

  • @return true if the callback consumed the long click ,false otherwise

*/

boolean onItemChildLongClick(@NonNull CommomBaseAdapter adapter, @NonNull View view, int position);

}

/**

  • @author LHW

  • @date 2020/11/5.

  • Description:

*/

public interface OnItemChildClickListener {

/**

  • callback method to be invoked when an item in this view has been

  • click and held

  • @param adapter this CommomBaseAdapter adapter

  • @param view The childView whihin the itemView that was clicked and held.

  • @param position The position of the view int the adapter

  • @return true if the callback consumed the long click ,false otherwise

*/

boolean onItemChildLongClick(@NonNull CommomBaseAdapter adapter, @NonNull View view, int position);

}

/**

  • @author LHW

  • @date 2020/11/5.

  • Description:

*/

public interface BaseListenerImp {

void setOnItemClickListener(@Nullable OnItemClickListener listener);

void setOnItemLongClickListener(@Nullable OnItemLongClickListener listener);

void setOnItemChildClickListener(@Nullable OnItemChildClickListener listener);

void setOnItemChildLongClickListener(@Nullable OnItemChildLongClickListener listener);

}

3. 实现万能适配器抽象类 CommomBaseAdapter

package com.lhw.common.adapter;

import android.content.Context;

import android.view.View;

import android.view.ViewGroup;

import androidx.annotation.NonNull;

import androidx.annotation.Nullable;

import androidx.recyclerview.widget.RecyclerView;

import com.lhw.common.adapter.listener.OnItemChildClickListener;

import com.lhw.common.adapter.listener.OnItemChildLongClickListener;

import com.lhw.common.adapter.listener.OnItemClickListener;

import com.lhw.common.adapter.listener.OnItemLongClickListener;

import java.lang.ref.WeakReference;

import java.util.ArrayList;

import java.util.LinkedHashSet;

import java.util.List;

/**

  • @author LHW

  • @date 2020/11/5.

  • Description:

*/

public abstract class CommomBaseAdapter<T, VH extends BaseViewHolder> extends RecyclerView.Adapter implements BaseListenerImp {

private List mData;//填充数据列表

private Context mContext;

private int mLayoutId;

private RecyclerView mRecyclerView;

private OnItemChildClickListener mOnItemChildClickListener;

private OnItemClickListener mOnItemClickListener;

private OnItemChildLongClickListener mOnItemChildLongClickListener;

private OnItemLongClickListener mOnItemLongClickListener;

LinkedHashSet childClickViewIds = new LinkedHashSet<>();//用于保存需要设置点击事件的 item

LinkedHashSet childLongClickViewIds =new LinkedHashSet<>();//用于保存需要设置长按点击事件的 item

public CommomBaseAdapter(List data, int layoutId) {

this.mData = data;

this.mLayoutId = layoutId;

}

/**

  • 定义数据填充抽象函数

  • @param holder

  • @param position

  • @param item

*/

protected abstract void setViewContent(@NonNull VH holder, int position, T item);

@Override

public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {

super.onAttachedToRecyclerView(recyclerView);

mContext = recyclerView.getContext();

mRecyclerView = recyclerView;

}

@NonNull

@Override

public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

//创建绑定ViewHolder

BaseViewHolder viewHolder = BaseViewHolder.createViewHolder(mContext, parent, viewType, mLayoutId);

//绑定点击事件

bindViewClickListener((VH) viewHolder, viewType);

return (VH) viewHolder;

}

@Override

public void onBindViewHolder(@NonNull VH holder, int position) {

//实现抽象函数的数据绑定

setViewContent(holder, position,(T) getData().get(position));

}

/**

  • 根据位置回去条目对象

  • @param position

  • @return

*/

public T getItem(int position){

if (!mData.isEmpty())

return mData.get(position);

return null;

}

/**对象获取条目是否存在

  • 如果返回 -1,表示不存在

  • @param item T?

  • @return Int

*/

public int getItemPosition(T item) {

if (item != null && !mData.isEmpty())

return mData.indexOf(item);

return -1;

}

public LinkedHashSet getChildClickViewIds() {

return childClickViewIds;

}

public LinkedHashSet getChildLongClickViewIds() {

return childLongClickViewIds;

}

/**

  • 添加子条目点击事件

  • @param viewIds

*/

public void addChildClickViewIds(int … viewIds){

for (int viewId : viewIds) {

childClickViewIds.add(viewId);

}

}

/**

  • 添加子条目长按点击事件

  • @param viewIds

*/

public void addChildLongClickViewIds(int … viewIds){

for (int viewId : viewIds) {

childLongClickViewIds.add(viewId);

}

}

/**

  • 绑定 item 点击事件

  • @param holder VH

*/

protected void bindViewClickListener(final VH holder, int viewType) {

holder.itemView.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

setOnItemClick(holder.itemView, holder.getAdapterPosition());

}

});

holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {

@Override

public boolean onLongClick(View v) {

return setOnItemLongClick(holder.itemView, holder.getAdapterPosition());

}

});

for (Integer id : getChildClickViewIds()) {

holder.itemView.findViewById(id).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

setOnItemChildClick(v,holder.getAdapterPosition());

}

});

}

for (Integer id : getChildLongClickViewIds()) {

holder.itemView.findViewById(id).setOnLongClickListener(new View.OnLongClickListener() {

@Override

public boolean onLongClick(View v) {

return setOnItemChildLongClick(v,holder.getAdapterPosition());

}

});

}

}

public List getData() {

if (null == mData) {

return new ArrayList<>();

}

return mData;

}

public void setData(List mData) {

this.mData = mData;

}

@Override

public int getItemCount() {

return mData.size();

}

/**

  • override this method if you want to override click event logic

  • 如果你想重新实现 item 点击事件逻辑,请重写此方法

  • @param v

  • @param position

*/

protected void setOnItemClick(View v, int position) {

mOnItemClickListener.onItemClickListener(this, v, position);

}

/**

  • override this method if you want to override longClick event logic

  • 如果你想重新实现 item 长按事件逻辑,请重写此方法

  • @param v

  • @param position

  • @return

*/

protected boolean setOnItemLongClick(View v, int position) {

return mOnItemLongClickListener.onItemLongClick(this, v, position);

}

protected void setOnItemChildClick(View v, int position) {

mOnItemChildClickListener.onItemChildLongClick(this, v, position);

}

protected boolean setOnItemChildLongClick(View v, int position) {

return mOnItemChildLongClickListener.onItemChildLongClick(this, v, position);

}

@Override

public void setOnItemChildClickListener(@Nullable OnItemChildClickListener listener) {

mOnItemChildClickListener = listener;

}

@Override

public void setOnItemClickListener(@Nullable OnItemClickListener listener) {

mOnItemClickListener = listener;

}

@Override

public void setOnItemChildLongClickListener(@Nullable OnItemChildLongClickListener listener) {

mOnItemChildLongClickListener = listener;

}

@Override

public void setOnItemLongClickListener(@Nullable OnItemLongClickListener listener) {

mOnItemLongClickListener = listener;

}

public OnItemChildClickListener getOnItemChildClickListener() {

总结

算法知识点繁多,企业考察的题目千变万化,面对越来越近的“金九银十”,我给大家准备好了一套比较完善的学习方法,希望能帮助大家在有限的时间里尽可能系统快速的恶补算法,通过高效的学习来提高大家面试中算法模块的通过率。

这一套学习资料既有文字档也有视频,里面不仅仅有关键知识点的整理,还有案例的算法相关部分的讲解,可以帮助大家更好更全面的进行学习,二者搭配起来学习效果会更好。

部分资料展示:




有了这套学习资料,坚持刷题一周,你就会发现自己的算法知识体系有明显的完善,离大厂Offer的距离更加近。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
ic void setOnItemLongClickListener(@Nullable OnItemLongClickListener listener) {

mOnItemLongClickListener = listener;

}

public OnItemChildClickListener getOnItemChildClickListener() {

总结

算法知识点繁多,企业考察的题目千变万化,面对越来越近的“金九银十”,我给大家准备好了一套比较完善的学习方法,希望能帮助大家在有限的时间里尽可能系统快速的恶补算法,通过高效的学习来提高大家面试中算法模块的通过率。

这一套学习资料既有文字档也有视频,里面不仅仅有关键知识点的整理,还有案例的算法相关部分的讲解,可以帮助大家更好更全面的进行学习,二者搭配起来学习效果会更好。

部分资料展示:

[外链图片转存中…(img-cOtVUIus-1715137707877)]
[外链图片转存中…(img-buWVw8Bg-1715137707878)]
[外链图片转存中…(img-XWo17RZZ-1715137707878)]
[外链图片转存中…(img-ttrdN715-1715137707879)]

有了这套学习资料,坚持刷题一周,你就会发现自己的算法知识体系有明显的完善,离大厂Offer的距离更加近。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!

RecyclerView 打造简单的万能适配器Adapter 此处万能适配器只是简单的实现了数据的填充和点击,其他功能待后续扩展 1.首先定义一个父类的BaseViewHolder 继承 RecyclerView.ViewHolder package com.lhw.common.adapter; import android.content.Context; import android.graphics.drawable.Drawable; import android.util.SparseArray; import android.view.Lay.. 阅读详情

相关推荐

Android——RecyclerView——Adapter完全图解,带你彻底掌握万能的适配器

1.和RecyclerView的观察关系 一个Adapter可以被多个RecyclerView观察。 那么这个观察关系是怎么建立的呢? 首先定位到RecyclerView内部维护的观察者。 private final RecyclerViewDataObserver mObserver = new RecyclerViewDataObserver(); 第二,找到这个

qq_36523667的博客 3116

Android——recyclerview.adapter公共方法、类、接口的作用简述

RecyclerView.Adapter 是一个抽象类,它定义了 RecyclerView 的数据和视图的绑定器。它有三个抽象方法需要重写: * onCreateViewHolder(ViewGroup parent, int viewType) :每当 RecyclerView 需要创建新的 ViewHolder 时,它都会调用此方法。此方法会创建并初始化 ViewHolder 及其关联的 View ,但不会填充视图的内容,因为 ViewHolder 此时尚未绑定到具体数据。

star_nwe的博客 3143

排除 AcroForm 中 JavaScript 脚本的 Bug

本文介绍了Acrobat JavaScript脚本故障排除的基本方法。首先应检查控制台窗口的错误报告,通过具体示例演示了5类常见错误:语法错误(如缺少大括号)、未终止字符串、未定义变量、运算符混淆及变量作用域问题,并逐步给出修复方案。文章还提供了调试流程UML图和实用经验总结,强调关注细节(如分隔符匹配)、正确使用运算符和变量作用域等要点。最后建议采用系统化调试方法,包括关闭/重新打开表单等完整性测试。

小猫三两只。 1499

Android——RecyclerView入门学习之RecyclerView.Adapter

学习资料: 鸿洋大神为RecyclerView打造通用Adapter让RecyclerView更加好用鸿洋大神Android优雅的为RecyclerView添加HeaderView和FooterView 之前使用RecyclerView.Adapter,基本就类似套用公式,死步骤,对Adapter感到既熟悉又陌生。从去年我开始接触学习Android之时,RecyclerView已经开始大量

ChatHello的博客 2万+

西门子精致面板TP1200 历史数据(历史数据、审计追踪) 移存到网络路径

TP1200 审计追踪

zhang080602的博客 5768

0基础手把手搭建 Trae\+Seedance2\.0 真人短剧生成智能体(可直接运行)

前言:本文专为0基础新手编写,全程无复杂代码、无专业术语,一步一截图提示(操作路径清晰),只需跟着点鼠标、复制粘贴,就能搭建出可自动生成真人短剧的智能体,生成的短剧可直接导出发布。核心工具:Trae(字节跳动AI IDE,免费)+ Seedance2.0(真人视频生成API,公测免费),无需提前学习编程、设计,全程10-15分钟搞定。 适用人群:0基础小白、想快速生成真人短剧(自媒体、短视频创作者)、无需懂技术即可实现自动化短剧生成的人群。

skygulangfendouz的专栏 1058

RecyclerView 打造简单的万能适配器Adapter(3)

说一千道一万,不如自己去行动。要想在移动互联网的下半场是自己占有一席之地,那就得从现在开始,从今天开始,马上严格要求自己,既重视业务实现能力,也重视基础和原理。基础夯实好了,高楼才能够平地而起,稳如泰山。最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2020-2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。还有。

2401_84408092的博客 613

从零开始:PLUMED与GROMACS整合安装全攻略

本文详细介绍了如何从零开始整合安装PLUMED与GROMACS,包括系统环境检查、MPI配置、PLUMED编译安装、GROMACS补丁应用及常见问题解决方案。通过本教程,研究人员可以快速完成分子动力学模拟工具的整合安装,实现增强采样和自由能计算功能。

weixin_42520796的博客 292

RecyclerView 打造简单的万能适配器Adapter(2)

最后这里放上我这段时间复习的资料,这个资料也是偶然一位朋友分享给我的,里面包含了腾讯、字节跳动、阿里、百度2020-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。还有高级架构技术进阶脑图、高级进阶架构资料帮助大家学习提升进阶,这里我也免费分享给大家也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。一起互勉~《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

2401_84876278的博客 1055

单片机NTC热敏电阻测温:六种实用电路方案与选型指南

本文详细介绍了单片机系统中NTC热敏电阻测温的六种实用电路方案,包括分压法、恒流源法、RC充放电法、电桥法、频率法及集成专用IC方案,并提供了关键的硬件选型指南和软件处理技巧,帮助工程师实现高精度、低成本的温度测量。

herb5的博客 816

PCL Alpha Shapes平面点云边界特征提取【2026最新版】

alpha shapes算法用于平面点云的边界特征提取。博客长期更新,本文最近一次更新时间为:2026年4月20日。

点云侠的博客 27万+
上一篇: LeetCode刷题笔记4寻找两个正序数组的中位数
下一篇: View和ViewGroup
普通网友
博客等级 码龄3年 2661粉丝 261原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值