当前位置:

首页 > 系统应用 > 2.5.1 ListView Item多布局的实现

2.5.1 ListView Item多布局的实现

本节引言: 本节是ListView这个小节的最后一节,给大家带来的是ListView多布局Item的实现, 何为ListView Item多布局,打个比方,QQ这种聊天列表: 假如他是用一个ListView做的,那么一个ListView上不就有两种不同的Item咯! 一左一右,嘿嘿,本节就来教大家如

本文目录

    本节引言:

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

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

    1.要点讲解:

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

    2.代码实现:

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

    MutiLayoutAdapter.ja va:

    /**
     * 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 mData = null;
    public MutiLayoutAdapter(Context mContext,ArrayList 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 当作第一个参数传进去,紧接着就会报出下面这个错误:

    The key must be an application-specific resource id 就是前面这个要唯一,定义一个final类型的int变量和硬编码一个值的方式都是行不通的 这里的做法是直接在strings.xml中添加:

    
    

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

    MainActivity.ja va:

    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 mData = null;
        private MutiLayoutAdapter myAdapter = null;
    @Override
        protected void onCreate(Bundle sa vedInstanceState) {
            super.onCreate(sa vedInstanceState);
            setContentView(R.layout.activity_main);
    //数据准备:
            mData = new ArrayList();
            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的对象!

    3.代码下载:

    ListViewDemo6.zip

    本节小结:

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

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

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    系统应用
    相关文章 更多
    Yandex官网入口及最新访问地址
    Yandex官网入口及最新访问地址

    Yandex搜索引擎官方入口是https://www.yondex.net/,该平台具备强大的多语言搜索能力、集成化的服务生态体系以及智能化的搜索体验优化功能。

    Yandex国际版入口及官网链接
    Yandex国际版入口及官网链接

    Yandex国际版官网为https://www.yondex.net/,提供英文界面,适合非俄语用户;2.https://www.yondex.net/为全球短域名,可自动跳转至对应地区版本;3.俄罗斯本地用户使用https://www.yondex.net/,内容以俄语为主,本地化程度高;4.普通用户可根据语言和需求选择相应入口。

    Yandex官网入口及网页版访问教程
    Yandex官网入口及网页版访问教程

    Yandex官方在线入口是https://www.yondex.net/,提供网页搜索、新闻、图片视频检索、地图导航等服务,并集成翻译、邮箱、云存储、日历等工具,支持个性化首页定制与电商比价功能。

    妖精漫画官网登录入口及首页指南
    妖精漫画官网登录入口及首页指南

    妖精漫画官网登录入口为https://www.yaojingmh.com。该平台资源丰富,涵盖多种题材,更新及时,分类清晰,支持多模式阅读与个性化收藏,具备评论、书架、弹幕等互动功能,界面简洁流畅,适配移动端,提供良好阅读体验。

    Yandex官网入口及最新搜索平台访问方式
    Yandex官网入口及最新搜索平台访问方式

    Yandex搜索平台最新访问入口是https://www.yondex.net/,该网站界面简洁,支持多语言切换和智能提示,具备强大的自然语言处理与多样化内容检索功能,并集成翻译、云存储、邮件等附加服务。

    Yandex搜索引擎官网入口及登录教程
    Yandex搜索引擎官网入口及登录教程

    俄罗斯Yandex搜索引擎创建于1993年,是俄语区主导的搜索服务,官网为https://www.yondex.net/,用户可直接访问并切换语言,无需注册即可使用其搜索、地图、邮箱等集成服务。

    Yandex浏览器官网登录与在线体验入口
    Yandex浏览器官网登录与在线体验入口

    Yandex浏览器官方网站登录入口是https://www.yondex.net/,提供多语言下载、账户同步、广告拦截、Turbo模式及隐私保护等功能,支持跨设备数据同步与安全浏览。

    2026年AO3镜像最新地址及稳定入口
    2026年AO3镜像最新地址及稳定入口

    ao3镜像2026最新入口包括主站archiveofourown.org、镜像站ao3mirror.com和xiaozhan.icu,建议收藏备用并根据网络情况切换使用。

    Win10搜索不到蓝牙耳机的排查与连接方法
    Win10搜索不到蓝牙耳机的排查与连接方法

    面向在Windows 10系统中无法发现蓝牙耳机的用户,本文提供从耳机配对模式到系统设置的完整排查路径。首先确保耳机已充电并进入可被搜索的配对状态,断开与其他设备的连接;随后在Win10设置中开启蓝牙并添加设备。若蓝牙开关缺失或适配器异常,需通过设备管理器检查驱动状态并更新,以恢复正常的蓝牙音频设备识别功能。

    Win10蓝牙耳机麦克风没声音?检查输入设备与权限设置
    Win10蓝牙耳机麦克风没声音?检查输入设备与权限设置

    面向在Windows 10系统中遇到蓝牙耳机能听声但无法录音的用户,本文解决因输入通道选择错误、隐私权限关闭或语音连接缺失导致的麦克风无声问题。关键步骤包括:在系统声音设置中正确选择Headset Microphone或Hands-Free AG Audio作为输入设备;在隐私设置中开启应用访问麦克风权限;确认蓝牙状态包含语音连接而非仅音乐连接,必要时重新配对或更新驱动。注意Stereo模式不支持麦克风输入,勿为音质牺牲通话功能。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    为什么要购买正版软件?
    01 官方授权

    授权来源透明,订单与许可信息可随时查询。

    02 即时交付

    付款成功后自动发放激活信息,支持订单追踪。

    03 中文协助

    安装、激活、迁移与续费问题都有专人响应。

    04 长期可用

    提供升级提醒与授权管理,换机时也能轻松迁移。

    网站备案号:苏ICP备2026018738号-1 联系邮箱:bd@zhengruan.com 网站地图

    Copyright ©2018-2026