ListView 使用详解

和您一起终身学习,这里是程序员Android

本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:

一、ListView 简介
二、ListView 常用属性
三、ListView主要使用方法如下
四、使用android:entries 为ListView准备数据
五、使用List 为ListView 准备数据
六、ListView 添加头,尾,空布局实现
七、使用SimpleAdapter 为Listview 适配图文
八、使用BaseAdapter 为Listview适配图文
九、 ListView 分类显示
十、参考文献

一、ListView 简介

学习ListView 之前,我们先了解一下ListView 的继承关系,ListView 继承关系如下:

java.lang.Object
   ↳    android.view.View
       ↳    android.view.ViewGroup
           ↳    android.widget.AdapterView<android.widget.ListAdapter>
               ↳    android.widget.AbsListView
                   ↳    android.widget.ListView

ListViewAndroid中显示数据常用的控件之一,主要用于显示一个垂直滚动的数据集合,随着Android 手机对性能要求越来越高,一个更现代,更灵活,显示列表性能更优异的RecyclerView将会逐渐取代ListView的数据显示方式,但是目前为止,ListView在开发中还是十分常见的,并未被弃用。

二、ListView 常用属性

ListView XML常用属性如下:

1.android:divider
2.android:dividerHeight
3.android:entries   
4.android:footerDividersEnabled 
5.android:headerDividersEnabled

三、ListView主要使用方法如下:

ListView 常用来显示同分类数据,常用使用方法如下:

1. 准备数据源

    List mAddHeaderFooterList = new ArrayList<String>();

2.将数据源添加到适配器中

        ArrayAdapter adapter = new ArrayAdapter<String>(this, 
                               android.R.layout.simple_list_item_1, mAddHeaderFooterList);

3. 将适配器中的数据添加到ListView 中

        mListView.setAdapter(adapter);

四、 使用android:entries 为ListView准备数据

1.实现效果如下

android:entries

2.实现代码如下

Listview标签中直接用数组为ListView填充数据
entries 属性使用方法:

    <ListView
        android:id="@+id/lv_entries"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="@android:color/darker_gray"
        android:dividerHeight="2dp"
        android:visibility="gone"
        android:entries="@array/citys" />

3. 填充数据如下

array 数组资源

    <string-array name="citys">
        <item>北京</item>
        <item>上海</item>
        <item>广州</item>
        <item>深圳</item>
        <item>郑州</item>
        <item>成都</item>
    </string-array>

五、 使用List 为ListView 准备数据

1.实现效果如下

ListView

2.部分实现代码如下:

    public void ListViewArrayList(View view) {

        ClearAllView();
        mListViewArray.setVisibility(View.VISIBLE);
        // 1.准备数据源
        final String[] citys = getResources().getStringArray(R.array.citys);
        // 2.将数据源加载到适配器中
        // ArrayAdapter adapter = new ArrayAdapter<String>(ListViewMethods.this,
        // android.R.layout.simple_expandable_list_item_1, citys);
        // 3.将适配器中的数据加载到ListView控件中

        mArrayList = Arrays.asList(citys);
        ArrayAdapter adapter = new ArrayAdapter<String>(ListViewMethods.this,
                android.R.layout.simple_expandable_list_item_1, mArrayList);

        mListViewArray.setAdapter(adapter);

    }

六、ListView 添加头,尾,空布局实现

1.实现效果如下

ListView添加头 尾 空布局
  • 主要方法如下:

2. 添加头布局方法

ListView.addHeaderView(View)

3.添加尾布局方法

ListView.addFooterView(View)

4. ListView数据为空时, 设置空布局方法

ListView.setEmptyView(View)

5.效果图实现代码如下


    public void ListViewHAddHeaderFooter(View view) {
        ClearAllView();
        mListAddHeadFooter.setVisibility(View.VISIBLE);

        // 准备数据源
        mAddHeaderFooterList = new ArrayList<String>();

        for (int i = 0; i < 6; i++) {
            mAddHeaderFooterList.add("测试" + i);
        }
        // 将数据源添加到适配器中
        final ArrayAdapter adapter = new ArrayAdapter<String>(
                ListViewMethods.this, android.R.layout.simple_list_item_1,
                mAddHeaderFooterList);
        // 添加listview 头
        imageHeader = new ImageView(this);
        imageHeader.setLayoutParams(new AbsListView.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT));
        imageHeader.setImageResource(R.drawable.gril);
        imageHeader.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int index = mAddHeaderFooterList.size();
                for (int i = index; i < index + 20; i++) {
                    mAddHeaderFooterList.add("加载更多数据内容" + i);
                }
                adapter.notifyDataSetChanged();
            }
        });
        mListAddHeadFooter.addHeaderView(imageHeader);

        // 添加listview 尾
        btnFooter = new Button(this);
        btnFooter.setLayoutParams(new AbsListView.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT));
        btnFooter.setText("点击加载更多");
        btnFooter.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                int index = mAddHeaderFooterList.size();
                for (int i = index; i < index + 20; i++) {
                    mAddHeaderFooterList.add("加载更多" + i);
                }
                adapter.notifyDataSetChanged();
            }
        });
        mListAddHeadFooter.addFooterView(btnFooter);

        TextView tv = new TextView(this);
        tv.setLayoutParams(new AbsListView.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT));
        tv.setText("数据为空");
        mListAddHeadFooter.setEmptyView(tv);

        // 将适配器中的数据添加到ListView 中
        mListAddHeadFooter.setAdapter(adapter);
    }

七、使用SimpleAdapter 为Listview 适配图文

1. 实现效果如下

SimpleAdapter

2. 实现代码如下


    public void ListViewSimpleAdapter(View view) {
        ClearAllView();
        mListViewSimple.setVisibility(View.VISIBLE);
        int[] images = { R.drawable.gril, R.drawable.ic_launcher,
                R.drawable.gril, R.drawable.ic_launcher, R.drawable.gril,
                R.drawable.ic_launcher, R.drawable.gril,
                R.drawable.ic_launcher, R.drawable.gril, };

        mSimpleList = new ArrayList<Object>();
        // 准备数据
        for (int i = 0; i < images.length; i++) {
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("img", images[i]);
            map.put("text", "item" + i);
            mSimpleList.add(map);
        }

        /**
         * 将数据源的数据加载到适配器中 SimpleAdapter context: 上下文对象 data:表示加载到适配器中的数据对象
         * resource: 表示adapter控件中每项资源id from:表示数据源map 中key 的数组,表示key指定的值
         * to:表示需要展示对应数据的控件资源id
         * 
         * 通过from 和to的对应,将from 中key值对应的数据指定的显示到to 指定资源id的控件中
         * 
         * **/

        SimpleAdapter adapter = new SimpleAdapter(ListViewMethods.this,
                mSimpleList, R.layout.listview_item_img_tv, new String[] {
                        "img", "text" }, new int[] { R.id.img, R.id.tv });
        // 将适配器中的数据添加到控件中
        mListViewSimple.setAdapter(adapter);
    }

3. 使用的item 布局如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_margin="5dp"
        android:gravity="center_vertical"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_margin="5dp"
        android:textColor="@android:color/darker_gray"
        android:text="test"
        android:gravity="center_vertical"
        android:textSize="25sp" />
</LinearLayout>

八、使用BaseAdapter 为Listview适配图文

1.实现效果如下

BaseAdapter

2.实现代码如下


    public void ListViewBaseAdapter(View view) {
        ClearAllView();
        mListViewBase.setVisibility(View.VISIBLE);

        mBaseAdapterList = new ArrayList<Map<String, Object>>();
        int[] images = { R.drawable.gril, R.drawable.ic_launcher,
                R.drawable.gril, R.drawable.ic_launcher, R.drawable.gril,
                R.drawable.ic_launcher, R.drawable.gril,
                R.drawable.ic_launcher, R.drawable.gril, };

        for (int i = 0; i < images.length; i++) {
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("img", images[i]);
            map.put("text", "数据" + i);
            mBaseAdapterList.add(map);
        }

        MyBaseAdapter adapter = new MyBaseAdapter();
        mListViewBase.setAdapter(adapter);

    }

3.自定义适配器实现的方法


    class MyBaseAdapter extends BaseAdapter {

        // 当前适配器中加载数据的总条目
        @Override
        public int getCount() {
            return mBaseAdapterList.size();
        }

        // 根据指定下标获取对应item 的view
        @Override
        public Object getItem(int position) {
            return mBaseAdapterList.get(position);
        }

        // 根据指定下标获取当前item的id
        @Override
        public long getItemId(int position) {
            return position;
        }

        /**
         * 获取适配器控件中的View对象,得到用于展示数据的视图 int position,:当前item的下标 View convertView,
         * 表示可复用的View ViewGroup parent 当前绘制的item 所属的listview
         */

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

            // 表示第一次运行创建,否则复用view
            if (convertView == null) {

                convertView = LayoutInflater.from(ListViewMethods.this)
                        .inflate(R.layout.listview_item_img_tv, null);
                mHolder = new Holder();
                mHolder.tv = (TextView) convertView.findViewById(R.id.tv);
                mHolder.img = (ImageView) convertView.findViewById(R.id.img);
                convertView.setTag(mHolder);

            } else {
                // 进行复用
                mHolder = (Holder) convertView.getTag();
            }

            mHolder.tv.setText((String) mBaseAdapterList.get(position).get(
                    "text"));
            mHolder.img.setImageResource((Integer) mBaseAdapterList.get(
                    position).get("img"));

            return convertView;
        }
    }

    class Holder {
        public TextView tv;
        public ImageView img;

    }

4.使用的item 布局如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_margin="5dp"
        android:gravity="center_vertical"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_margin="5dp"
        android:textColor="@android:color/darker_gray"
        android:text="test"
        android:gravity="center_vertical"
        android:textSize="25sp" />
</LinearLayout>

九、 ListView 分类显示

1.实现效果如下:

ListView 分类显示

2.实现代码如下:


    public void ListViewTypeBaseAdapter(View view) {
        ClearAllView();
        mListViewType.setVisibility(View.VISIBLE);

        MyTypeBaseAdapter myTypeBaseAdapter = new MyTypeBaseAdapter();
        mListViewType.setAdapter(myTypeBaseAdapter);

    }

    class MyTypeBaseAdapter extends BaseAdapter {
        private String[] tittles = { "分类一 :水果", "分类二 :蔬菜" };
        private String[] mTypeOneList = { "苹果", "香蕉", "梨", "西瓜", "菠萝" };
        private String[] mTypeTwoList = { "番茄", "土豆", "大葱", "辣椒", "莲藕", "白菜",
                "萝卜", "豆角", "芹菜", "茄子" };
        int[] typeOneImages = { R.drawable.gril, R.drawable.ic_launcher,
                R.drawable.gril, R.drawable.ic_launcher, R.drawable.gril };
        int[] typeTwoImages = { R.drawable.gril, R.drawable.ic_launcher,
                R.drawable.gril, R.drawable.ic_launcher, R.drawable.gril,
                R.drawable.gril, R.drawable.ic_launcher, R.drawable.gril,
                R.drawable.ic_launcher, R.drawable.gril };

        @Override
        public int getCount() {
            return mTypeOneList.length + mTypeTwoList.length + 2;
        }

        @Override
        public Object getItem(int position) {
            if (position == 0 || position == mTypeOneList.length + 1) {
                return 0;
            } else {
                if (position < mTypeOneList.length + 1) {
                    return mTypeOneList[position];
                } else {
                    return mTypeTwoList[position - mTypeOneList.length - 2];
                }

            }
        }

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

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

            int mode = getItemViewType(position);
            if (mode == 0) {
                ViewTitleHolder holder = null;
                if (convertView == null) {
                    convertView = View.inflate(getApplicationContext(),
                            R.layout.listview_type_tv, null);
                    holder = new ViewTitleHolder();
                    holder.textView = (TextView) convertView
                            .findViewById(R.id.tv);
                    convertView.setTag(holder);
                } else {
                    holder = (ViewTitleHolder) convertView.getTag();
                }

                if (position == 0) {
                    holder.textView.setText(tittles[position]);
                } else {
                    holder.textView.setText(tittles[1]);
                }

                return convertView;

            } else {
                ViewHolder holder = null;
                if (convertView == null) {
                    convertView = View.inflate(getApplicationContext(),
                            R.layout.listview_item_img_tv, null);
                    holder = new ViewHolder();
                    holder.imageView = (ImageView) convertView
                            .findViewById(R.id.img);
                    holder.textView = (TextView) convertView
                            .findViewById(R.id.tv);

                    convertView.setTag(holder);
                } else {
                    holder = (ViewHolder) convertView.getTag();
                }
                if (position < mTypeOneList.length + 1) {
                    holder.textView.setText(mTypeOneList[position - 1]);
                    holder.imageView
                            .setImageResource(typeOneImages[position - 1]);
                } else {
                    holder.textView.setText(mTypeTwoList[position
                            - mTypeOneList.length - 2]);
                    holder.imageView.setImageResource(typeTwoImages[position
                            - mTypeOneList.length - 2]);
                }

                return convertView;
            }

        }

        @Override
        public int getItemViewType(int position) {
            if (position == 0 || position == mTypeOneList.length + 1) {
                return 0;
            } else {
                return 1;
            }
        }

        @Override
        public int getViewTypeCount() {
            return super.getViewTypeCount() + 1;
        }
    }

    static class ViewHolder {
        ImageView imageView;
        TextView textView;

    }

    static class ViewTitleHolder {
        TextView textView;
    }

3.使用的item 布局如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/tv"
        android:background="@android:color/darker_gray"
        android:padding="5dp"
        android:paddingLeft="10dp"
        android:textSize="16sp"
        android:textColor="@android:color/white"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

十、参考文献

【腾讯文档】Android 基础知识库https://docs.qq.com/doc/DSWdKRWh1VnVHYWFP

至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,472评论 25 707
  • 前几天,女儿想吃草莓,去水果店一问“一斤八块钱”,先生当场拒买。“又不是不知道价格,也太漫天要价了。” 后来,在马...
    愿你我都幸福阅读 338评论 1 5
  • 好牌,今天拿到了兼职费用,嘿嘿,充实的一天。并且用赚的钱纹身了,感觉真好。
    瀚文ILoveU阅读 97评论 0 0
  • [TOC] 本文主要记录自己学习zookeeper时的一些个人笔记。不喜勿喷。 1 环境准备 随便建个java项目...
    hylexus阅读 226评论 0 1
  • 凤头蛇尾”似乎深入人心 ---俠名 近日厦大教授的事可谓炒的沸沸扬扬,但我们今天无权谈论教师这一伟大职业,有厦大教...
    子墨不吃土豆阅读 536评论 0 0