热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

通用ExpandableListViewAdapter封装

介绍了一种简单且可复用的BaseAdapter封装方法,适用于ExpandableListView,减少重复代码,提高开发效率。

本文介绍了一种针对ExpandableListView的通用BaseAdapter封装方法,通过这种方式,开发者可以在不直接继承BaseExpandableListView或重写其方法的情况下,轻松创建适配器。这种方法不仅简化了代码,还提高了组件的复用性,支持ExpandableListView和普通的ListView。

项目源码已托管在GitHub上,链接如下:

https://github.com/crook3/ExpandableListviewAdapter

使用方法:

在项目的build.gradle文件中添加依赖:

implementation 'com.tranwon:expandablelistview:1.0.1'

在Android应用开发中,ListView是使用频率较高的控件之一。通常情况下,为了实现ListView的功能,开发者需要自定义BaseAdapter,并重写其中的方法。当一个应用中包含多个ListView时,这种重复的工作量会显著增加,导致代码冗余。为此,许多开发者选择封装通用的BaseAdapter,以减少重复劳动。

例如:https://github.com/hongyangAndroid/baseAdapter

基于类似的需求,当应用中需要使用到ExpandableListView(一种支持二级列表显示的控件)时,我们可以自定义一个BaseExpandableListViewAdapter,避免多次重复编写相同的方法。这个封装后的适配器,可以让开发者只需几行代码就能完成配置,极大地简化了工作流程。

原理简介

1. 封装ViewHolder

public class MyViewHolderExpandbleListView {
private SparseArray mViews;
private int mPosition;
private View mConvertView;

public MyViewHolderExpandbleListView(Context context, ViewGroup parent, int layoutId, int position) {
this.mPosition = position;
this.mViews = new SparseArray<>();
mCOnvertView= LayoutInflater.from(context).inflate(layoutId, parent, false);
mConvertView.setTag(this);
}

public static MyViewHolderExpandbleListView get(Context context, View convertView, ViewGroup parent, int layoutId, int position) {
if (cOnvertView== null) {
return new MyViewHolderExpandbleListView(context, parent, layoutId, position);
} else {
MyViewHolderExpandbleListView holder = (MyViewHolderExpandbleListView) convertView.getTag();
holder.mPosition = position;
return holder;
}
}
public T getView(int viewId) {
View view = mViews.get(viewId);
if (view == null) {
view = mConvertView.findViewById(viewId);
mViews.put(viewId, view);
}
return (T) view;
}
public View getConvertView() {
return mConvertView;
}
}

2. 继承BaseExpandableListAdapter进行封装

protected Context mContext;
protected List mDatasParent;
protected List mDatasChild;
protected LayoutInflater mInflater;
private int mLayoutIdParent;
private int mLayoutIdChild;

public MyBaseAdapterExpandbleListview(Context context, List datasParent, List datasChild, int layoutIdParent, int layoutIdChild) {
this.mCOntext= context;
mInflater = LayoutInflater.from(context);
this.mDatasParent = datasParent;
this.mDatasChild = datasChild;
this.mLayoutIdParent = layoutIdParent;
this.mLayoutIdChild = layoutIdChild;
}

@Override
public int getGroupCount() {
return mDatasParent.size();
}

@Override
public int getChildrenCount(int groupPosition) {
return 1;
}

@Override
public T getGroup(int groupPosition) {
return mDatasParent.get(groupPosition);
}

@Override
public T getChild(int groupPosition, int childPosition) {
return mDatasChild.get(childPosition);
}

@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}

@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}

@Override
public boolean hasStableIds() {
return false;
}

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
MyViewHolderExpandbleListView holder = MyViewHolderExpandbleListView.get(mContext, convertView, parent, mLayoutIdParent, groupPosition);
convertParent(holder, getGroup(groupPosition));
return holder.getConvertView();
}

@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
MyViewHolderExpandbleListView holder = MyViewHolderExpandbleListView.get(mContext, convertView, parent, mLayoutIdChild, childPosition);
convertChild(holder, getChild(groupPosition, childPosition));
return holder.getConvertView();
}

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}

public abstract void convertParent(MyViewHolderExpandbleListView holder, T item);
public abstract void convertChild(MyViewHolderExpandbleListView holder, T item);

3. 使用示例

通过继承CommonAdapter并覆写convert方法,可以非常方便地使用这个适配器。例如,对于ExpandableListView的使用,可以参考以下代码:

MyBaseAdapterExpandbleListview adapter = new MyBaseAdapterExpandbleListview<>(
getApplicationContext(),
mListParentData,
mListChildData,
R.layout.item_parent,
R.layout.item_child) {
@Override
public void convertParent(MyViewHolderExpandbleListView holder, String item, int parentPosition) {
TextView tv = holder.getView(R.id.tv1);
tv.setText(item);
}

@Override
public void convertChild(MyViewHolderExpandbleListView holder, String item, int parentPosition, int childPosition) {
TextView tv = holder.getView(R.id.tv1);
tv.setText(item);
}
};

对于ListView的使用,可以参考以下代码:

MyBaseAdapterListview adapter = new MyBaseAdapterListview<>(
getApplicationContext(),
mListData,
R.layout.listview_item) {
@Override
public void convert(MyViewHolderExpandbleListView holder, String item) {
TextView tv = holder.getView(R.id.tv1);
tv.setText(item);
ImageView im = holder.getView(R.id.image);
im.setImageResource(R.mipmap.ic_launcher);
}
};

推荐阅读
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
author-avatar
陈玲琳2013
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有