为具有不同项目布局的 ListView 创建 ViewHolder

2023-12-04

我有一个 ListView,针对不同的项目有不同的布局。有些项目是分隔符。有些项目是不同的,因为它们保存不同类型的数据等。

我想实现 ViewHolders 来加速 getView 过程,但我不太确定如何去做。不同的布局有不同的数据(这使得命名变得困难)和我想要使用的不同数量的视图。

我该怎么做呢?

我能想到的最好的想法是创建一个包含 X 个项目的通用 ViewHolder,其中 X 是项目布局中视图的数量,其中视图的数量最多。对于具有少量视图的其他视图,我将仅使用 ViewHolder 中这些变量的一小部分。假设我有 2 个布局用于 2 个不同的项目。一个有 3 个 TextView,另一个有 1 个。我将创建一个具有 3 个 TextView 变量的 ViewHolder,并且仅将其中 1 个用于我的其他项目。我的问题是,这看起来真的很丑,而且感觉很老套;特别是当项目布局可能有许多不同类型的视图时。

这是一个非常基本的 getView:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    MyHolder holder;

    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.layout_mylistlist_item, parent, false);

        holder = new MyHolder();
        holder.text = (TextView) v.findViewById(R.id.mylist_itemname);
        v.setTag(holder);
    }
    else {
        holder = (MyHolder)v.getTag();
    }

    MyListItem myItem = m_items.get(position);

    // set up the list item
    if (myItem != null) {
        // set item text
        if (holder.text != null) {
            holder.text.setText(myItem.getItemName());
        }
    }

    // return the created view
    return v;
}

假设我有不同类型的行布局,我可以为每种类型的行都有一个 ViewHolder。但是我会声明什么类型的“holder”位于顶部呢?或者我会为每种类型声明一个持有者,然后将其用于我所在的行类型。


ListView 有一个内置的类型管理系统。在您的适配器中,您有多种类型的项目,每种类型都有自己的视图和布局。通过覆盖获取项目视图类型要返回给定位置的数据类型,ListView 必须传入该数据类型的正确转换视图。然后,在 getView 方法中只需检查数据类型并使用 switch 语句以不同的方式处理每种类型。

每个布局类型都应该有自己的视图持有者,以便命名清晰并易于维护。将 ViewHolder 命名为与每种数据类型相关的名称,以保持一切正常。

尝试将所有内容重叠到一个 ViewHolder 中是不值得的。

Edit Example

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    int viewType = this.getItemViewType(position);

    switch(viewType)
    {
       case TYPE1:

        Type1Holder holder1; 

         View v = convertView; 
         if (v == null) { 
             LayoutInflater vi = (LayoutInflater)getContext().getSystemService     (Context.LAYOUT_INFLATER_SERVICE); 
             v = vi.inflate(R.layout.layout_mylistlist_item_type_1, parent, false); 

             holder1 = new Type1Holder (); 
             holder1.text = (TextView) v.findViewById(R.id.mylist_itemname); 
             v.setTag(holder1); 
         } 
         else { 
             holder1 = (Type1Holder)v.getTag(); 
         } 

         MyListItem myItem = m_items.get(position); 

         // set up the list item 
         if (myItem != null) { 
             // set item text 
             if (holder1.text != null) { 
                 holder1.text.setText(myItem.getItemName()); 
             } 
         } 

         // return the created view 
         return v; 


     case TYPE2:
            Type2Holder holder2; 

         View v = convertView; 
         if (v == null) { 
             LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
             v = vi.inflate(R.layout.layout_mylistlist_item_type_2, parent, false); 

             holder2 = new Type2Holder (); 
             holder2.text = (TextView) v.findViewById(R.id.mylist_itemname); 
             holder2.icon = (ImageView) v.findViewById(R.id.mylist_itemicon); 
             v.setTag(holder1); 
         } 
         else { 
             holder2 = (Type2Holder)v.getTag(); 
         } 

         MyListItem myItem = m_items.get(position); 

         // set up the list item 
         if (myItem != null) { 
             // set item text 
             if (holder2.text != null) { 
                 holder2.text.setText(myItem.getItemName()); 
             } 

             if(holder2.icon != null)
                 holder2.icon.setDrawable(R.drawable.icon1);
         } 


         // return the created view 
         return v; 


       default:
           //Throw exception, unknown data type
    }
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为具有不同项目布局的 ListView 创建 ViewHolder 的相关文章

  • 您的应用中的 Google Analytics SDK

    我按照这里的说明进行操作 https developers google com analytics devguides collection android v3 https developers google com analytics
  • 如何在Android上获取当前播放曲目的路径[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想编写一个应用程序将当前播放的音乐流式传输到另一台设备 两个设备之间的连接确实有效 我还可以通过 wifi 传输一些字符串 但在获取
  • 在 Android 中使用 awt

    我有一个绘制图表的 Java Swing 应用程序 它使用 Graphics2D 调用和 awt 对象 例如 Rectangle 等 在某些时候我可能想将其移植到 Android 上 我知道我无法在 Android 上使用 Graphics
  • AIRPLANE_MODE 的广播接收器无法与 SDK 26 一起使用

    通常 我使用简单的代码来放置Toast当用户改变AIRPLANE MODE 并且它可以使用targetSdkVersion 25 我的 AirPlaneModeReceiver public class AirPlaneModeReceiv
  • 清晰的图标 清晰的 Android 应用程序

    你好 下午好 关于如何提高图标的 png 质量 有什么想法吗 我使用了 Android 开发者页面上的套件 但我无法获得清晰的图像 我的意思是非常清晰 我是否需要以不同的方式加载此图标 而不仅仅是拖入我的布局 谢谢 我使用这个布局
  • 与通用地图相比,MapView 的分辨率较差

    我刚刚收到 HTC Desire 进行测试 我注意到 残留在小于整个屏幕的框架中的地图视图不如通用地图应用程序那么清晰 有什么办法解决这个问题吗 您应该使用 API 级别 4 或更高级别编译应用程序 然后在 AndroidManifest
  • 将项目添加到 android 框架的设置中

    我正在 android 框架中工作 我想向 android 操作系统中的现有设置添加一个项目 您能告诉我如何执行此操作吗 首先阅读有关偏好活动 http developer android com reference android pre
  • Android 在 Windowmanager 中调整视图大小

    这是我的代码 menubuttonClosed li inflate R layout menu button null menubutton ImageButton menubuttonClosed findViewById R id m
  • 构建应用程序时出现 BufferOverflowException

    每次我想运行我的 Android 应用程序时 我都会收到错误 2013 11 02 13 05 36 Dex Loader Unable to execute dex java nio BufferOverflowException Che
  • 在活动启动期间优雅地处理屏幕方向变化

    我正在尝试找到一种方法来正确处理设置活动 其中活动的方向是根据启动它的意图中的数据确定的 这是一款用户可以选择关卡的游戏 其中一些是纵向的 一些是横向的 我面临的问题是setRequestedOrientation ActivityInfo
  • MutableStateflow 值、更新、发出

    假设我有一个可变状态流 https kotlin github io kotlinx coroutines kotlinx coroutines core kotlinx coroutines flow mutable state flow
  • 如何防止应用程序被盗(针对Android应用程序)?

    我想知道防止人们窃取我的应用程序的最有效方法是什么 在线下载 apk 的副本而不是购买它 我已经花了一个lot特别是 Droidbox 上的时间 并且不会发布 Sync 直到我可以保证提供专业版本的非法副本的人无法发布 有人实施过这个吗 我
  • 如何在Room的数据库迁移中正确添加索引?

    我在迁移 Room 数据库时遇到问题 在更新的数据库中 我必须将一个字段从整数更改为双精度值 我读到它并不像听起来那么容易 为了做到这一点 我必须使用这个更改后的属性创建新的临时表 复制前一个表中的所有值 删除旧的值 最后重命名临时表 我的
  • 有没有办法创建 PWA(渐进式 Web 应用程序)的 Android 桌面小部件?

    我正在构建一个渐进式 Web 应用程序 有没有办法创建 Android 桌面小部件 None
  • 如何让surfaceview透明

    大家好 我想让我的 DrawingSurface 视图透明 我尝试了很多东西 但它不起作用 这是我的 xml 代码 使我的表面视图透明
  • SimpleDateFormat 无法解析的日期 如果语言环境为 ES,则会出现错误。推特“创建时间”

    我正在尝试将 Twitter created at 转换为阿根廷日期时间 如果我这样做 final String TWITTER EEE MMM dd HH mm ss SimpleDateFormat sf new SimpleDateF
  • Android - 检测视图上的双击和三次点击

    我一直在尝试构建一个可以检测双敲击和三敲击的敲击检测器 在我的努力失败后 我在网上搜索了很长时间以找到可以使用的东西 但没有运气 奇怪的是 像这样的图书馆如此稀缺 有什么帮助吗 你可以尝试这样的事情 尽管我通常建议不要使用三次点击作为一种模
  • Android:选择 EditField 上焦点上的所有文本

    我试图让 Android 在获得焦点时选择 EditText 字段中的所有文本 我在布局中使用此属性 在两个字段上 android selectAllOnFocus true 我不确定这是否相关 但为了将光标移动到第一个可编辑字段 前面 还
  • AndroidAnnotations 和 Dagger

    我正在尝试使用 Dagger 注入 Android 带注释的 Activity java lang IllegalArgumentException No inject registered for members com app serv
  • 在两个片段之间拖放视图

    我目前正在尝试在两个片段之间实现拖放 我已经将它们添加到我的活动中 如下所示 FragmentManager fm getFragmentManager FragmentTransaction ft fm beginTransaction

随机推荐

  • 通过邮寄方式将文件上传到服务器 OutOfMemory

    我正在开发一个远程备份应用程序 有时我需要上传大文件 例如 15 MB 我在一些手机上进行了测试 但出现内存不足错误 有没有办法使用此功能使用更少的内存 public int uploadFile String sourceFileUri
  • 在 k8s 集群中,我是否应该始终调用入口规则或节点端口服务名称?

    我有多个安心服务在我们的系统内 有些是我们的withinKubernetescluster Others are on legacy基础设施和托管在虚拟机上 我们的许多安心服务 make 同步调用彼此 所以不是异步使用消息队列 我们还有许多
  • 使用 mysql 按多列排序

    下面显示的是我需要的查询order by有了这三列 这是用于复杂的搜索列表 如果我使用其中之一 它就会完美地工作 但处理不止一个时 它无法正确排序 EDIT 其实我需要的是 优质唱片一定要排在第一位 而且喜欢的唱片也比较多 而且精英客户有更
  • WAMP重装后部分数据库内容消失

    我搞砸了 Apache 的配置文件 我在同一个文件夹中重新安装了 没有任何卸载 WAMP 但我没有安装 2 4 而是安装了 2 5 所以 WAMP 之后光荣地失败了 我无法再访问 WAMP 因此无法从 PHPMyAdmin 备份我的数据库
  • 实现时的问题:CSS 按钮中的活动

    我在使用 CSS 制作菜单时遇到问题 问题是我想使用 active 来突出显示我当前的按钮 但尝试了很多次之后 我仍然找不到如何在我的代码中实现它 I use li 里面有标签 a 标签以确保按钮背景和文本颜色在选择时发生变化 因为在尝试放
  • 缺少临时文件夹

    我正在 mac OSX 10 8 上使用内置的 apache 服务器和 php mysql 在 Moodle 2 4 上进行开发 我遇到的问题是 为什么我尝试上传任何内容 却收到错误消息 PHP 缺少临时文件夹 然后 我将实时副本下载到我的
  • cypress:如果元素 xpath 不存在,如何管理应用程序流程

    我有以下场景 如果该元素存在 我必须执行一项活动 如果不存在 我将执行另一项活动 cy xpath div text button its length then res gt if res gt 0 return 1 else cy lo
  • 为什么我不能使用 --target 和 --editable 调用 pip?

    我在用着 cd 我的包 pip install target 部署目录 准备在 Google App Engine 上部署的包 但为了在 dev appserver py 下进行测试 我想在开发模式下安装该包 即使用 editable 但是
  • Javascript - 正则表达式来验证日期格式[重复]

    这个问题在这里已经有答案了 有没有办法在 JavaScript 中使用正则表达式来验证多种格式的日期 例如 DD MM YYYY 或 DD MM YYYY 或 DD MM YYYY 等 我需要将所有这些都放在一个正则表达式中 但我不太擅长
  • memset 的速度与直接赋值为零的速度

    请考虑下面的结构定义 struct xyz char a void ptr uint16 t num1 uint32 t num2 uint64 t num3 我可以通过以下三种方式之一将此结构的实例初始化为零 申报时 struct xyz
  • 如何创建在 Windows 中打开文件的热键

    我正在创建一个应用程序 我希望当用户打开我的应用程序时 它应该为自己创建一个热键 例如ctrl alt f以便每次用户按下这些组合键时应用程序都会自动运行 我知道如何通过右键单击应用程序并添加组合键在 Windows 中手动实现此目的 但我
  • 使用 if 语句声明 const 的值

    我有一个const numberOfComments这是一个数组的大小 我想要另一个const riskByComments其值为 5 如果numberOfComments大于2 否则应为0 我知道我可以轻松做到这一点let 但我知道最好只
  • 模板参数中的“T”和“const T”有什么区别吗?

    以下2种语法有什么区别 template
  • 是否可以获取特定格式的 java.util.Date 对象?

    我想问一下java util Date的用法 这是我的示例课程 public class DateConverter public static void main String args SimpleDateFormat simpleDa
  • 我使用Lua脚本下载了mp4文件,但TikTok(其他应用程序)找不到该视频

    在Android手机上使用Lua脚本成功下载mp4文件后 系统视频无法检测到1 mp4文件 在TikTok中也找不到该视频进行发布 我使用脚本下载了 1 mp4 我手动复制1 mp4成为copy mp4 1 抖音无法检测到mp4 copy
  • 如何在 jQuery 中通过自定义属性的特定值获取元素?

    我有一个名为的自定义属性数据角色我想找到所有元素数据角色 内容 在 jQuery 中 我目前正在使用一些旧的 JavaScript 代码来执行此操作 var elements element getElementsByTagName tag
  • 除了 CURLOPT_COOKIEFILE 之外,如何使用 PHP curl 发送 cookie?

    提交表单后 我正在从网站上抓取一些内容 问题是脚本时不时地失败 比如说五分之二的脚本失败 我使用 php curl COOKIEFILE 和 COOKIEJAR 来处理 cookie 然而 当我观察浏览器发送的标头 从浏览器访问目标网站并使
  • Python 使用另一个文件的输入在文件中搜索文本

    我是 python 和编程新手 我需要一些关于 python 脚本的帮助 有两个文件 每个文件包含电子邮件地址 超过 5000 行 输入文件包含我要在数据文件中搜索的电子邮件地址 还包含电子邮件地址 然后我想将输出打印到文件或显示在控制台上
  • PhpMy管理员密码

    我收到错误 1045 用户 root localhost 访问被拒绝 使用密码 NO 在我不小心更改了 phpmyadmin 中 root 和 127 0 0 1 的密码后 问题是我无法更改 common lib php 我想以某种方式恢复
  • 为具有不同项目布局的 ListView 创建 ViewHolder

    我有一个 ListView 针对不同的项目有不同的布局 有些项目是分隔符 有些项目是不同的 因为它们保存不同类型的数据等 我想实现 ViewHolders 来加速 getView 过程 但我不太确定如何去做 不同的布局有不同的数据 这使得命