当前位置:

首页 > 系统应用 > 2.4.5 ListView简单实用

2.4.5 ListView简单实用

本节引言: 这一节继续把前面没讲完的 UI 控件部分接着往下理顺。上一节已经先把 Adapter 适配器的基本概念过了一遍,也分别看了三个最基础适配器的用法: ArrayAdapter、SimpleAdapter 和 SimpleCursorAdapter。接下来要正式进入第一个需要配合 Adapt

本文目录

    本节引言:

    这一节继续把前面没讲完的 UI 控件部分接着往下理顺。上一节已经先把 Adapter 适配器的基本概念过了一遍,也分别看了三个最基础适配器的用法:
    ArrayAdapter、SimpleAdapter 和 SimpleCursorAdapter。接下来要正式进入第一个需要配合 Adapter 一起使用的 UI 控件:ListView。当然,现在的新版本开发里,它已经基本被 RecyclerView 这个新控件替代了。
    不过,列表类控件始终是最常见、也最值得打牢基础的一类,所以 ListView 依然很有学习价值。本节会站在初学者的理解路径上,先把 ListView、ListView 的属性,以及 BaseAdapter 的简单定义讲清楚。至于 ListView 的优化这部分,先别着急,后面一步一步展开。

    1.自定义BaseAdapter,然后绑定ListView的最简单例子

    先看看我们要实现的效果图:

    一个很简单的ListView,自己写下Item,然后加载点数据这样~ 下面贴下关键代码:

    Animal.ja va:

    /**
     * Created by Jay on 2015/9/18 0018.
     */
    public class Animal {
        private String aName;
        private String aSpeak;
        private int aIcon;
    public Animal() {
        }
    public Animal(String aName, String aSpeak, int aIcon) {
            this.aName = aName;
            this.aSpeak = aSpeak;
            this.aIcon = aIcon;
        }
    public String getaName() {
            return aName;
        }
    public String getaSpeak() {
            return aSpeak;
        }
    public int getaIcon() {
            return aIcon;
        }
    public void setaName(String aName) {
            this.aName = aName;
        }
    public void setaSpeak(String aSpeak) {
            this.aSpeak = aSpeak;
        }
    public void setaIcon(int aIcon) {
            this.aIcon = aIcon;
        }
    }

    AnimalAdapter.ja va:自定义的BaseAdapter:

    /**
     * Created by Jay on 2015/9/18 0018.
     */
    public class AnimalAdapter extends BaseAdapter {
    private LinkedList mData;
        private Context mContext;
    public AnimalAdapter(LinkedList mData, Context mContext) {
            this.mData = mData;
            this.mContext = mContext;
        }
    @Override
        public int getCount() {
            return mData.size();
        }
    @Override
        public Object getItem(int position) {
            return null;
        }
    @Override
        public long getItemId(int position) {
            return position;
        }
    @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal,parent,false);
            ImageView img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
            TextView txt_aName = (TextView) convertView.findViewById(R.id.txt_aName);
            TextView txt_aSpeak = (TextView) convertView.findViewById(R.id.txt_aSpeak);
            img_icon.setBackgroundResource(mData.get(position).getaIcon());
            txt_aName.setText(mData.get(position).getaName());
            txt_aSpeak.setText(mData.get(position).getaSpeak());
            return convertView;
        }
    }

    最后是MainActivity.ja va:

    public class MainActivity extends AppCompatActivity {
    private List mData = null;
        private Context mContext;
        private AnimalAdapter mAdapter = null;
        private ListView list_animal;
    @Override
        protected void onCreate(Bundle sa vedInstanceState) {
            super.onCreate(sa vedInstanceState);
            setContentView(R.layout.activity_main);
            mContext = MainActivity.this;
            list_animal = (ListView) findViewById(R.id.list_animal);
            mData = new LinkedList();
            mData.add(new Animal("狗说", "你是狗么?", R.mipmap.ic_icon_dog));
            mData.add(new Animal("牛说", "你是牛么?", R.mipmap.ic_icon_cow));
            mData.add(new Animal("鸭说", "你是鸭么?", R.mipmap.ic_icon_duck));
            mData.add(new Animal("鱼说", "你是鱼么?", R.mipmap.ic_icon_fish));
            mData.add(new Animal("马说", "你是马么?", R.mipmap.ic_icon_horse));
            mAdapter = new AnimalAdapter((LinkedList) mData, mContext);
            list_animal.setAdapter(mAdapter);
        }
    }

    好的,自定义BaseAdapter以及完成数据绑定就是这么简单~
    别问我拿示例的代码,刚开始学就会写出这些代码,我只是演示下流程,让大家熟悉 熟悉而已~另外,也是为下面的属性验证做准备~

    2.表头表尾分割线的设置:

    listview作为一个列表控件,他和普通的列表一样,可以自己设置表头与表尾: 以及分割线,可供我们设置的属性如下:

    • footerDividersEnabled:是否在footerView(表尾)前绘制一个分隔条,默认为true
    • headerDividersEnabled:是否在headerView(表头)前绘制一个分隔条,默认为true
    • divider:设置分隔条,可以用颜色分割,也可以用drawable资源分割
    • dividerHeight:设置分隔条的高度

    翻遍了了API发现并没有可以直接设置ListView表头或者表尾的属性,只能在Ja va中写代码 进行设置了,可供我们调用的方法如下:

    • addHeaderView(View v):添加headView(表头),括号中的参数是一个View对象
    • addFooterView(View v):添加footerView(表尾),括号中的参数是一个View对象
    • addHeaderView(headView, null, false):和前面的区别:设置Header是否可以被选中
    • addFooterView(View,view,false):同上

    对了,使用这个addHeaderView方法必须放在listview.setAdapter前面,否则会报错。

    使用示例:

    运行效果图:

    代码实现:

    先编写下表头与表尾的布局:

    view_header.xml(表头),表尾一样,就不贴了:

    
    
        
    

    MainActivty.ja va:

    public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener{
    private List mData = null;
        private Context mContext;
        private AnimalAdapter mAdapter = null;
        private ListView list_animal;
        private LinearLayout ly_content;
    @Override
        protected void onCreate(Bundle sa vedInstanceState) {
            super.onCreate(sa vedInstanceState);
            setContentView(R.layout.activity_main);
            mContext = MainActivity.this;
            list_animal = (ListView) findViewById(R.id.list_animal);
            //动态加载顶部View和底部View
            final LayoutInflater inflater = LayoutInflater.from(this);
            View headView = inflater.inflate(R.layout.view_header, null, false);
            View footView = inflater.inflate(R.layout.view_footer, null, false);
    mData = new LinkedList();
            mData.add(new Animal("狗说", "你是狗么?", R.mipmap.ic_icon_dog));
            mData.add(new Animal("牛说", "你是牛么?", R.mipmap.ic_icon_cow));
            mData.add(new Animal("鸭说", "你是鸭么?", R.mipmap.ic_icon_duck));
            mData.add(new Animal("鱼说", "你是鱼么?", R.mipmap.ic_icon_fish));
            mData.add(new Animal("马说", "你是马么?", R.mipmap.ic_icon_horse));
            mAdapter = new AnimalAdapter((LinkedList) mData, mContext);
            //添加表头和表尾需要写在setAdapter方法调用之前!!!
            list_animal.addHeaderView(headView);
            list_animal.addFooterView(footView);
    list_animal.setAdapter(mAdapter);
            list_animal.setOnItemClickListener(this);
        }
    @Override
        public void onItemClick(AdapterView parent, View view, int position, long id) {
            Toast.makeText(mContext,"你点击了第" + position + "项",Toast.LENGTH_SHORT).show();
        }
    }

    好的,代码还是比较简单的,从上面我们看出来一个要注意的问题,就是:

    添加表头表尾后,我们发现positon是从表头开始算的,就是你添加的第一个数据本来的 postion 是 0,但是此时却变成了 1,因为表头也算!!

    3.列表从底部开始显示:stackFromBottom

    如果你想让列表显示你列表的最下面的话,那么你可以使用这个属性,将stackFromBottom 属性设置为true即可,设置后的效果图如下:

    4.设置点击颜色cacheColorHint

    如果你为ListView设置了一个图片作为Background的话,当你拖动或者点击listView空白位置会发现 item都变成黑色了,这是时候我们可以通过这个cacheColorHint将颜色设置为透明:#00000000

    5.隐藏滑动条

    我们可以通过设置:android:scrollbars="none" 或者 setVerticalScrollBarEnabled(true); 解决这个问题!

    本节小结:

    好的,关于ListView的基本用法大概就这些,当然除了上述的这些属性外还有其他的, 实际遇到再查查吧~这里知道如何去重写BaseAdapter和完成数据绑定就好,下节我们来 教大家如何来优化这个BaseAdapter的编写~

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系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 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。