Android 基础入门教程ListView Item多布局的实现

ListView的Item对应多布局,滚动错位 我相信肯定有不少人和我一样需要做到这样一个效果,一个ListView需要对用多个布局,就是类似与QQ的聊天页面一样,是对应的两种布局,这样的情况下能想到的当然就是在Adapter里的getView方法的地方通过判断来选择使用哪一种布局,这种想法是没有错的,但是实际应用的时候却会出现一定问题,比如我滚动ListView的时候原来应该用1布局的那个Item结果用的布局2,造成ListView上的数据错 阅读详情

本节引言:

本节是ListView这个小节的最后一节,给大家带来的是ListView多布局Item的实现, 何为ListView Item多布局,打个比方,QQ这种聊天列表:

假如他是用一个ListView做的,那么一个ListView上不就有两种不同的Item咯! 一左一右,嘿嘿,本节就来教大家如何实现ListView的多布局!


1.要点讲解:

重写getItemViewType()方法对应View是哪个类别,以及getViewTypeCount()方法iew返回 总共多少个类别!然后再getView那里调用getItemViewType获得对应类别,再加载对应的View!


2.代码实现:

这里的话直接用上一节的两个布局,然后另外写一个Adapter重写要点中的几个几个地方:


MutiLayoutAdapter.java:

/**
 * Created by Jay on 2015/9/23 0023.
 */
public class MutiLayoutAdapter extends BaseAdapter{

    //定义两个类别标志
    private static final int TYPE_BOOK = 0;
    private static final int TYPE_APP = 1;
    private Context mContext;
    private ArrayList<Object> mData = null;


    public MutiLayoutAdapter(Context mContext,ArrayList<Object> mData) {
        this.mContext = mContext;
        this.mData = mData;
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public Object getItem(int position) {
        return mData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    //多布局的核心,通过这个判断类别
    @Override
    public int getItemViewType(int position) {
        if (mData.get(position) instanceof App) {
            return TYPE_APP;
        } else if (mData.get(position) instanceof Book) {
            return TYPE_BOOK;
        } else {
            return super.getItemViewType(position);
        }
    }

    //类别数目
    @Override
    public int getViewTypeCount() {
        return 2;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        int type = getItemViewType(position);
        ViewHolder1 holder1 = null;
        ViewHolder2 holder2 = null;
        if(convertView == null){
           switch (type){
               case TYPE_APP:
                   holder1 = new ViewHolder1();
                   convertView = LayoutInflater.from(mContext).inflate(R.layout.item_one, parent, false);
                   holder1.img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
                   holder1.txt_aname = (TextView) convertView.findViewById(R.id.txt_aname);
                   convertView.setTag(R.id.Tag_APP,holder1);
                   break;
               case TYPE_BOOK:
                   holder2 = new ViewHolder2();
                   convertView = LayoutInflater.from(mContext).inflate(R.layout.item_two, parent, false);
                   holder2.txt_bname = (TextView) convertView.findViewById(R.id.txt_bname);
                   holder2.txt_bauthor = (TextView) convertView.findViewById(R.id.txt_bauthor);
                   convertView.setTag(R.id.Tag_Book,holder2);
                   break;
           }
        }else{
            switch (type){
                case TYPE_APP:
                    holder1 = (ViewHolder1) convertView.getTag(R.id.Tag_APP);
                    break;
                case TYPE_BOOK:
                    holder2 = (ViewHolder2) convertView.getTag(R.id.Tag_Book);
                    break;
            }
        }

        Object obj = mData.get(position);
        //设置下控件的值
        switch (type){
            case TYPE_APP:
                App app = (App) obj;
                if(app != null){
                    holder1.img_icon.setImageResource(app.getaIcon());
                    holder1.txt_aname.setText(app.getaName());
                }
                break;
            case TYPE_BOOK:
                Book book = (Book) obj;
                if(book != null){
                    holder2.txt_bname.setText(book.getbName());
                    holder2.txt_bauthor.setText(book.getbAuthor());
                }
                break;
        }
        return convertView;
    }


    //两个不同的ViewHolder
    private static class ViewHolder1{
        ImageView img_icon;
        TextView txt_aname;
    }

    private static class ViewHolder2{
        TextView txt_bname;
        TextView txt_bauthor;
    }
}

这里有个地方要注意的,convertView.setTag(R.id.Tag_APP,holder1);我们平时都直接 setTag(Object)的,这个是setTag的重载方法,参数是一个唯一的key以及后面的一个对象! 唯一!!我一开始直接把TYPE_BOOK作为第一个参数,然后就报下面这个错误:

键必须是特定于应用程序的资源 ID 就是前面这个要唯一,定义一个final类型的int变量和硬编码一个值的方式都是行不通的 这里的做法是直接在strings.xml中添加:

<item name="Tag_APP" type="id"></item>
<item name="Tag_Book" type="id"></item>

当然你也可以在res/values/下另外创建一个ids.xml文件,把上面这段代码贴上去! 除了这个还有一个要注意的地方,就是这个区分类别的标志要从0开始算,不然会报下面 这样的错误:


MainActivity.java:

public class MainActivity extends AppCompatActivity {

    private static final int TYPE_BOOK = 0;
    private static final int TYPE_APP = 1;
    private ListView list_content;
    private ArrayList<Object> mData = null;
    private MutiLayoutAdapter myAdapter = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //数据准备:
        mData = new ArrayList<Object>();
        for(int i = 0;i < 20;i++){
            switch ((int)(Math.random() * 2)){
                case TYPE_BOOK:
                    mData.add(new Book("《第一行代码》","郭霖"));
                    break;
                case TYPE_APP:
                    mData.add(new App(R.mipmap.iv_icon_baidu,"百度"));
                    break;
            }
        }

        list_content = (ListView) findViewById(R.id.list_content);
        myAdapter = new MutiLayoutAdapter(MainActivity.this,mData);
        list_content.setAdapter(myAdapter);
    }
}

上面随机生成0和1,0就往集合中添加一个Book的对象,1的话就添加一个App的对象!



本节小结:

好的,本节给大家讲解了ListView Item多布局的实现,就是两个方法的重写, 然后getView()做下判断,设置不同的布局而已~代码非常简单~

关于ListView的知识就告一段落吧,当然ListView的知识并不止这些, 异步加载,优化等等,这些我们都会在进阶部分进行学习~就说这么多,谢谢~

Android 基础入门教程2.5.1 ListView Item多布局的实现 本文介绍了Android中ListView实现多布局Item的方法。通过重写getItemViewType()和getViewTypeCount()方法,可以区分不同Item类型并返回对应的布局。示例代码演示了如何创建自定义Adapter,处理两种不同类型的数据(Book和App),并根据类型加载对应的布局。关键点包括:1)定义不同类型标志;2)正确设置ViewHolder的Tag;3)在getView()中根据类型处理不同的数据绑定。这种方法适用于需要显示多种样式Item的场景,如聊天界面的左右消息布局。 阅读详情

相关推荐

【Android 】零基础到飞升 | ListView Item多布局的实现

2.5.1 ListView Item多布局的实现 本节引言: 本节是ListView这个小节的最后一节,给大家带来的是ListView多布局Item的实现, 何为ListView Item多布局,打个比方,QQ这种聊天列表: 假如他是用一个ListView做的,那么一个ListView上不就有两种不同的Item咯! 一左一右,嘿嘿,本节就来教大家如何实现ListView的多布局! 1.要点讲解: 重写getItemViewType()方法对应View是哪个类别,以及getViewTypeCount()

m0_58523831的博客 8万+

Android基础教程(非常详细)从零基础入门到精通,看完这一篇就够了

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…就算用户知道,去设置界面找到权限开关也颇费周折。打开手机的系统设置界面,进入到具体应用的管理页面,会发现该应用的存储访问权限被禁止了。

Python_0011的博客 3万+

一个AI Agent顶十个软件,toB赛道正在大洗牌

一个AI Agent顶十个软件,toB赛道正在大洗牌

ith321的博客 1331

Android基础入门教程(非常详细),从零基础入门到精通,看完这一篇就够了(附安装包)

gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。所谓的构建过程就是:编译,测试,依赖管理,打包,部署。以前我们开发是手动导入jar包的,类似于面向过程,一步一步来,缺什么包就导什么包,很麻烦,容易出错,jar包版本还不统一,需要关心jar包与jar包之间的依赖。

weixin_58257948的博客 6138

clumsy一款模拟弱网的工具

利用封装 Winodws Filtering Platform 的WinDivert 库, clumsy 能实时的将系统接收和发出的网络数据包拦截下来,人工的造成延迟,掉包和篡改操作后再进行发送。无论你是要重现网络异常造成的程序错误,还是评估你的应用程序在不良网络状况下的表现,clumsy 都能让你在不需要额外添加代码的情况下,在系统层次帮你达到想要的效果。

klb5555的专栏 2551

Eplan P8自动线号生成全攻略:从电位定义点到连接编号的完整流程

本文详细解析了Eplan P8自动线号生成的全流程,从电位定义点的创建配置到连接编号的标准化管理,帮助电气设计人员提升图纸规范性和工作效率。重点介绍了自动编号方案的定义与调整技巧,以及企业级标准化实施建议,是掌握Eplan P8自动线号功能的实用指南。

weixin_29254029的博客 510

【Android】全网最详细的Android入门基础教程,零基础速领

Android热门期已过,关于Android是否还值得学习这个问题,网友答案可谓众说纷纭。总结一下,说值得会被喷迫害青年才俊,说行业寒冬又被说天天灌毒鸡汤...现在,我们就来客观阐述一下Android现在乃至未来几年能不能学!

datian1234的博客 1万+

STM32驱动LED矩阵:IS31FL3731与查理复用技术实践

LED矩阵显示是嵌入式系统中常见的人机交互方式,其核心在于高效的驱动技术。查理复用(Charlieplexing)作为一种创新的矩阵扫描方式,通过引脚复用技术,用N个引脚驱动N²-N个LED,大幅提升了硬件资源利用率。IS31FL3731驱动芯片集成了这一技术,配合STM32F410RB微控制器的强大性能,可实现144个LED的精准控制。这种组合在艺术装置、信息展示等场景中展现出独特优势,既能呈现丰富的视觉效果,又能通过内置PWM调光实现256级亮度控制。通过I2C接口通信,开发者可以轻松实现字符显示、图像

weixin_29193359的博客 279

Android基础入门教程——2.4.8 ListView Item多布局的实现

Android基础入门教程——2.4.8 ListView Item多布局的实现标签(空格分隔): Android基础入门教程本节引言: 本节是ListView这个小节的最后一节,给大家带来的是ListView多布局Item的实现, 何为ListView Item多布局,打个比方,QQ这种聊天列表: 假如他是用一个ListView做的,那么一个ListView上不就有两种不同

Coder-Pig的猪栏 3万+

Autodesk全家桶怎么选?AutoCAD、Revit、Fusion 360等7款软件超全对比指南

本文深入对比了Autodesk旗下七款核心软件(AutoCAD、Revit、Inventor、Fusion 360、Maya、3ds Max、Forge)的核心定位与适用场景。针对建筑、制造、创意设计等不同专业需求,提供精准的选型指南,帮助用户根据自身工作流(如二维绘图、BIM协同、产品开发、影视动画)选择最匹配的工具,避免资源浪费并提升效率。

stone的博客 434

uniapp(全端兼容) - 最新详细实现双色球开奖走势图功能组件,uni-app红球走势图/蓝球走势图,解决双色球 “蓝球连线“ 问题,双色球效果及用线连接每个号码详细教程(同样适用于彩票开奖走势图

uni-app,双色球,安卓app,苹果app,微信小程序,移动端,H5网页,手机网站,微信小程序、支付宝小程序,手机app端,nvue,红球走势,蓝球走势,连线,uniapp(vue):js实现双色球开奖走势图带连线,vue2,vue3,uniApp双色球组件插件,uniapp如何实现双色球走势图和连线,彩票走势图,前端 Vue实现彩票走势图,详细示例,走势图,彩票项目,绘制股票走势图,前端 JS实现彩票开奖走势图 连线,Uniapp有没有双色球的页面代码,红球蓝球的走势图如何做,双色球红球和值尾走势图,

✅ 精选推荐文章 3346

ListView Item 多布局的实现

Android ListView 多布局实现摘要 ListView 多布局允许在列表中显示不同类型的项目视图,适用于聊天、商品列表等场景。实现要点: 核心方法: getViewTypeCount() 返回布局类型数量 getItemViewType() 指定每项的布局类型 getView() 根据类型绑定对应布局 实现步骤: 定义数据模型(区分不同类型) 创建多种布局XML文件 重写BaseAdapter方法 使用ViewHolder优化性能 典型应用: 文本+图片混合列表 聊天界面(文本/图片消息) 电商

likuoelie的博客 1042

Python爬取公交线路信息及站点shp数据 文末附数据下载地址

三、现在已经获取到了各个线路名称、链接,以及所途径的上下行站点,那么接下来就应该对开始对第三页url进行信息采集,即本次爬虫的最终目的:爬取所有站点的GPS坐标数据。但坑就坑在,二环一号线属于环线,所以只有左侧有站点数据,而其他非环线车次的站点数据分有上下行,如果用正则匹配,则分不清楚到底哪些是上行站点哪些是下行站点。以前爬过百度地图,当时用的是API平台,加上网站比较规范,所以标签节点什么的都比较清晰,但这次由于特殊原因所选择的网站为公交网,废话不多说直接开始吧。checi=二环一号线。

J_Giser的博客 1317

ListView Item多布局的实现

ListView多布局实现摘要 (150字内) Android中实现ListView多布局需重写BaseAdapter的3个关键方法: getViewTypeCount() - 返回布局类型总数 getItemViewType() - 根据数据返回对应布局类型标识 getView() - 按类型加载不同布局并绑定数据 典型场景: 聊天界面(文本/图片消息) 商品列表(不同商品样式) 实现步骤: 定义数据模型(含类型标识) 创建多种布局XML 在Adapter中动态判断类型 使用ViewHolder优化性能

m0_57545130的博客 800

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Android入门教程四十一之ListView Item多布局的实现

本节是ListView这个小节的最后一节,给大家带来的是ListView多布局Item的实现, 何为ListView Item多布局,打个比方,QQ这种聊天列表:假如他是用一个ListView做的,那么一个ListView上不就有两种不同的Item咯! 一左一右,嘿嘿,本节就来教大家如何实现ListView的多布局!1.要点讲解:重写getItemViewType()方法对应View是哪个类别,以及

无名 556

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android 之 ListView Item 多布局的实现

这里有个地方要注意的,convertView.setTag(R.id.Tag_APP,holder1);我们平时都直接 setTag(Object)的,这个是setTag的重载方法,参数是一个唯一的key以及后面的一个对象!假如他是用一个ListView做的,那么一个ListView上不就有两种不同的Item咯!一左一右,嘿嘿,本节就来教大家如何实现ListView的多布局!上面随机生成0和1,0就往集合中添加一个Book的对象,1的话就添加一个App的对象!//多布局的核心,通过这个判断类别。

leyang0910的博客 531

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

仿QQ聊天-listView的item多布局

仿QQ聊天界面以及聊天气泡。.9图片制作以及黑边处理。

lhp15575865420的博客 2013

HoRain云--ListView多布局实现技巧

本文介绍了ListView多布局Item的实现方法,通过重写getItemViewType()和getViewTypeCount()方法来实现不同类型的Item布局。代码示例展示了如何定义两种布局类型(TYPE_BOOK和TYPE_APP),并在getView()中根据类型加载对应的布局。特别提醒:setTag()需要使用唯一的资源ID作为key,建议在xml中定义;类型标志必须从0开始计数。示例通过随机生成0和1来模拟不同类型的数据,动态展示多布局效果。

sinat_57153473的博客 917

Android学习笔记二十五之ListView多布局实现

Android学习笔记二十五之ListView多布局实现

Huawen的博客 1882

Android ListView实现多种Item布局

前言 有时,我们的ListView的Item布局并非都是一样的,比如,我们需要一个按拼音排序的列表,如下图: 有的同学可能会说,直接把两种布局放在一个Item布局中,在getView中隐藏不用的那个布局不就行了。这种方法确实能够实现,也没什么问题,但是如果布局种类不止两种,而是20种或者更多呢?显然每次加载所有布局是很不明智的,而且很可能会造成界面卡顿。 其实,Google早想到了这一点,并提供...

weixin_33727510的博客 2852

关于设置ListView的Item多布局

今天做ListView多布局的时候,有个问题想不明白,找了一圈百度也没找出个结果。 一、数据源 建立一个BeautifulFlower类 public BeautifulFlower(String name, String color, int icon,int type) { this.name = name; this.color = color;

bluky_di的博客 905

Android RecyclerView和ListView多布局实现

前言 每个人每天都会在浏览器上看一些最新的新闻,作为一个IT程序员你们会发现,她们的布局排版都是有区别的,有时候同一个样式的条目有4、5条 界面一样,下面又出现1 条不一样的条目,这样的效果是不是很美观,这在Android称为多布局,下面来简单实现一下,大概理解下 使用 1.RecyclerView 利用Adapter的getItemViewType()方法返回不同的VIEW_TY...

zkbilian的博客 1310

java 返回多个listview_2.5.1 ListView Item多布局的实现 | 菜鸟教程

本节引言:本节是ListView这个小节的最后一节,给大家带来的是ListView多布局Item的实现,何为ListView Item多布局,打个比方,QQ这种聊天列表:假如他是用一个ListView做的,那么一个ListView上不就有两种不同的Item咯!一左一右,嘿嘿,本节就来教大家如何实现ListView的多布局!1.要点讲解:重写getItemViewType()方法对应View是哪个类...

weixin_35626356的博客 126
上一篇: Android 基础入门教程 GridLayout(网格布局)
下一篇: Android 基础入门教程 Android Http请求头与响应头的学习
奋进学堂
奋进学堂 新星创作者: 云计算技术领域 新星创作者: 云计算技术领域
博客等级 码龄8年 5183粉丝 906原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋进学堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值