Android开发笔记(12)——ListView & Adapter

转载请注明:http://www.cnblogs.com/igoslly/p/6947225.html

下一章是关于ListFragment的内容,首先先介绍ListView的相关配置,理解ListFragment也相较容易。

在fznpcy专栏:http://blog.csdn.net/fznpcy/article/details/8658155/有较为详尽的讲解和范例。

ListView & Adapter

一、Adapter

Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。

在常见的View(List View,Grid View)等地方都需要用到Adapter。

如下图直观的表达了Data、Adapter、View三者的关系:

Adapter存在多种形式,但我们这里只介绍常用的ArrayAdapter、SimpleAdapter和BaseAdapter

二、ArrayAdapter

每个Adapter都要自定义各自的item布局文件,ArrayAdapter只包含文字,一般使用android.R.layout.simple_list_item_1(系统定义好的布局文件只显示一行文字)

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:textColor="#fff"
    android:background="?android:attr/activatedBackgroundIndicator"
    android:minHeight="?android:attr/listPreferredItemHeightSmall"/>

创建ArrayAdapter

String[] strs = {"1","2","3","4","5"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.xxx,strs);

当然也可以在Android Studio —  strings.xml中直接定义ArrayList。

    <string-array name="list_item">
        <item>Practice Record</item>
        <item>Competition Record</item>
        <item>Previous History</item>
        <item>Game Rules</item>
        <item>How to use this app?</item>
        <item>User Information</item>
    </string-array>

在App的Drawer Layout中既可以简单使用,设定菜单列表。

三、SimpleAdapter

SimpleAdapter较ArrayAdapter能实现更复杂的结构,可放ImageView(图片),Button(按钮),CheckBox(复选框)等等。

包含ListView可直接继承ListActivity,和普通的Activity没有太大的差别,不同就是对显示ListView做了许多优化,方面显示而已。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="8"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="Null"
            android:textSize="20sp"
            android:padding="2dp"
            android:textColor="@color/black"
            android:id="@+id/list_competition_player"/>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="Null"
            android:textSize="16sp"
            android:padding="2dp"
            android:id="@+id/list_competition_date"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="3"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="100"
            android:gravity="center"
            android:textSize="24sp"
            android:textColor="@color/black"
            android:id="@+id/list_competition_scoreA"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="—"
            android:gravity="center"
            android:textSize="28sp"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="3"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="100"
            android:gravity="center"
            android:textSize="24sp"
            android:textColor="@color/black"
            android:id="@+id/list_competition_scoreB"/>
    </LinearLayout>
</LinearLayout>

接收参数包含

this,布局文件(alist.XML),Hash Map,布局文件控件Id。Hash Map的每个键值数据,和布局文件中对应id的组件,一一映射。

创建列表ArrayList,每个元素即是单独的Hash Map,根据key word关键字添加字符串 / 图片名

map.put("key_word1","value1");
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("title", "G1");
            map.put("info", "google 1");
            map.put("img", R.drawable.i1);
            list.add(map);

创建SimpleAdapter

SimpleAdapter adapter = new SimpleAdapter(this,getData(),R.layout.vlist,
                    new String[]{"title","info","img"},
                    new int[]{R.id.title,R.id.info,R.id.img});

实际效果图

包含图片的效果图

四、BaseAdapter

在列表上添加Button,实时修改Adapter,都必须使用BaseAdapter。

SimpleAdapter也继承于BaseAdapter。

BaseAdapter是抽象类,必须自定义一个Adapter继承它,也可结合ViewHolder进行显示。

/* 当List有大量的数据需要加载的时候,会占据大量内存,影响性能,这时候就需要按需填充并重新使用view来减少对象的创建

* 最快的方式是定义一个Viewholder,将convextag设置为Viewholder,不为空时重新使用即可

* findViewById是在解析layout.xml布局那种其中的子View,解析xml是一个力气活,所以提出了ViewHolder的概念

* 使用一个静态类,保存xml中的各个子View的引用关系,这样就不必要每次都去解析xml了。

*/

继承BaseAdapter定义时,必须重载4个函数:getCount()、getItem(int position)、getItemId(int position)、getView(int position, View convertView, ViewGroup parent)

    public class CompetitionListAdapter extends BaseAdapter {
        private LayoutInflater mInflater=null;
        public CompetitionListAdapter(Context context){
            this.mInflater=LayoutInflater.from(context);
        }
        @Override
        public int getCount(){
            return  competitionlist.size();
        }
        @Override
        public Object getItem(int position){
            return competitionlist.get(position);
        }
        @Override
        public long getItemId(int position){
            return position;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent){
            ViewHolder holder = null;
            if (convertView ==null){
                holder = new ViewHolder();
                convertView = mInflater.inflate(R.layout.history_list_competition,null);
                holder.date=(TextView)convertView.findViewById(R.id.list_competition_date);
                holder.scoreA=(TextView)convertView.findViewById(R.id.list_competition_scoreA);
                holder.scoreB=(TextView) convertView.findViewById(R.id.list_competition_scoreB);
                holder.player=(TextView)convertView.findViewById(R.id.list_competition_player);
                convertView.setTag(holder);
            }else {
                holder = (ViewHolder)convertView.getTag();
            }
            holder.date.setText((String)competitionlist.get(position).get("date"));
            holder.scoreA.setText((String)competitionlist.get(position).get("scoreA"));
           holder.scoreB.setText((String)competitionlist.get(position).get("scoreB"));
            holder.player.setText((String)competitionlist.get(position).get("player"));
            return convertView;
        }
        private class ViewHolder{
            public TextView date;
            public TextView player;
            public TextView scoreB;
            public TextView scoreA;
        }
    }

当数据源有修改时,需要notifyDataSetChanged()告知。

        public void setDataList(List<Map<String,Object>> list){
            if (list!=null){
                competitionlist=list;
                notifyDataSetChanged();
            }
        }


本笔记内容均为个人学习整理,转载请注明博客园-igoslly

时间: 2024-07-31 18:42:01

Android开发笔记(12)——ListView & Adapter的相关文章

Android开发笔记(一百零九)利用网盘实现云存储

网盘存储 个人开发者往往没有自己的后台服务器,但同时又想获取app的运行信息,这就要借助于第三方的网络存储(也叫网盘.云盘.微盘等等).通过让app自动在网盘上存取文件,可以间接实现后台服务器的存储功能,同时开发者也能及时找到app的用户信息. 曾几何时,各大公司纷纷推出免费的个人网盘服务,还开放了文件管理api给开发者调用,一时间涌现了网盘提供商的八大金刚:百度网盘.阿里云.华为网盘.腾讯微云.新浪微盘.360云盘.金山快盘.115网盘.可是好景不长,出于盈利.监管等等因素,各大网盘开放平台要

Android开发笔记(一百一十一)聊天室中的Socket通信

Socket通信 基本概念 对于程序开发来说,网络通信的基础就是Socket,但因为是基础,所以用起来不容易,今天我们就来谈谈Socket通信.计算机网络有个大名鼎鼎的TCP/IP协议,普通用户在电脑上设置本地连接的ip时,便经常看到下图的弹窗,注意红框部分已经很好地描述了TCP/IP协议的作用. TCP/IP是个协议组,它分为三个层次:网络层.传输层和应用层: 网络层包括:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 传输层包括:TCP协议.UDP协议. 应用层包括:HT

[置顶] Android开发笔记(成长轨迹)

分类: 开发学习笔记2013-06-21 09:44 26043人阅读 评论(5) 收藏 Android开发笔记 1.控制台输出:called unimplemented OpenGL ES API 调用了未实现的OpenGL ES API函数,一般由于导入的第三方库如地图库,里面有用到OpenGL,但是模拟器的硬件默认是没有这个的,所以需要我们编辑模拟器Emulation Options选项勾选 Use Host GPU 然后重启模拟器再尝试,如果还是这个错误,那么我们只好用真机测试了. 2.

Android开发笔记(一百)折叠式列表

更多动态视图MoreNewsView 经常看朋友圈的动态,有的动态内容较多就只展示前面一段,如果用户想看完整的再点击展开,这样整个页面的动态列表比较均衡,不会出现个别动态占用大片屏幕的情况.同样,查看博客的文章列表也类似,只展示文章开头几行内容,有需要再点击加载全篇文章. 动态列表直接使用ListView,动态内容就得自己写个控件了,自定义控件的难点在于如何把握动态下拉和收起的动画.这里我们要先预习TextView的相关函数,下面是本文用到的方法说明: getHeight : 获取TextVie

Android开发笔记(一百一十二)开发工具

Eclipse/ADT ADT是Google在Eclipse基础上封装了Android开发工具的环境,最新版本是2014年7月2日发布的adt-bundle-windows-x86_64-20140702,之后Google推出自己的开发环境Android Studio,就不再更新ADT了.不过基于Eclipse的广泛使用,当前还是有不少app使用ADT进行开发. 在Eclipse上安装插件的步骤如下:依次选择菜单"Help"--"Install New Software...

【转】Android开发笔记(序)写在前面的目录

原文:http://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经验教训,与网友互相切磋,从而去芜存菁进一步提升自己的水平.因此博主就想,入门的东西咱就不写了,人不能老停留在入门上:其次是想拾缺补漏,写写虽然小众却又用得着的东西:另外就是想以实用为主,不求大而全,但求小而精:还有就是有的知识点是java的,只是Android开发也会经常遇上,所以蛮记下来.个人的经

Android开发笔记(一百零三)地图与定位SDK

集成地图SDK 国内常用的地图SDK就是百度和高德了,二者的用法大同小异,可按照官网上的开发指南一步步来.下面是我在集成地图SDK时遇到的问题说明: 1.点击基本地图功能选项,不能打开地图,弹出"key验证出错!请在AndroidManifest.xml文件中检查key设置的"的红色字提示.查看日志提示"galaxy lib host missing meta-data,make sure you know the right way to integrate galaxy&

C#程序员学习Android开发系列之ListView

上篇博客解决了Android客户端通过WebService与服务器端程序进行交互的问题,这篇博客重点关注两个问题,一个是Android应用程序如何与本机文件型数据库SQLite进行交互,另一问题则是如何在ListView中按照我们想要的界面效果进行展示.限于篇幅这篇重点讲ListView,下篇博客重点阐述SQLite. ListView是一个常用的数据显示控件,假设我们要做一个简单的界面,如图所示. 这张图是我直接从Android平板电脑(Android 4.2.2)上面截图下来的,就是一个普通

Android开发笔记(一百一十六)网络学习资源

知名网站 本系列的开发笔记,对Android开发来说只是沧海一瓢,还有更多的技术等待我们去汲取.下面列出几个常用的开发网站,供初学者上路: 首先当然是国内首屈一指的技术网站csdn啦,csdn提供了众多频道,包括博客.论坛.下载.问答等等,其中博客专栏提供了最新的技术文章,值得推荐.csdn博客专栏的地址是 http://blog.csdn.net/column.html 下面是csdn博客专栏的网页截图: 其次是国外有名的开源网站GitHub,这里有众多的开源项目源码,是开发者分享代码的乐园.

Android开发之适配器-ListView适配器的重复数据

适配器是Android中的数据与View视图的桥梁,作用就是将数据通过适配器显示到对应的View视图上. 工作中,在用ListView做适配器数据时候,有些人肯定碰见过,如何优化效率,但是又出现重复数据的情况,如何避免重复数据而且又能提高ListView大数据量时候的效率呢?,解决方案就是2点: 1. 在getView方法中 进行View的判断,即做convertView ==null 这样的判断,这样是为了提高数据量大的时候的效率. 2.设置数据用setTag()/getTag()方法来进行对