Android笔记十一.ListView+Adapter - 新闻资讯 - 云南小程序开发|云南软件开发|云南网站建设-昆明葵宇信息科技有限公司

159-8711-8523

云南网建设/小程序开发/软件开发

知识

不管是网站,软件还是小程序,都要直接或间接能为您产生价值,我们在追求其视觉表现的同时,更侧重于功能的便捷,营销的便利,运营的高效,让网站成为营销工具,让软件能切实提升企业内部管理水平和效率。优秀的程序为后期升级提供便捷的支持!

您当前位置>首页 » 新闻资讯 » 技术分享 >

Android笔记十一.ListView+Adapter

发表时间:2020-10-19

发布人:葵宇科技

浏览次数:35


深刻懂得Adapter
一、ListView
    ListView是Android开辟过程中较为常见的组件之一,它将数据以列表的情势展示出来。一般而言,一个ListView由以下三个元素构成:
1.View:展示列表视图,平日是一个xml所指定的。大年夜家都知道Android的界面根本上是由xml文件负责完成的,所以ListView的界面也理所应当的应用了xml定义。例如在ListView中经常用到的“android.R.layout.simple_list_item_1”等, 就是Android体系内部定义好的一个xml文件。
2.Adapter适配器:用于将不合的数据映射到View上。不合的数据对应不合的适配器,如ArrayAdapter,CursorAdapter, SimpleAdapter等, 他们可以或许将数组,指针指向的数据,Map等数据或根本组件映射到View上。也恰是因为适配器的存在,使得ListView的应用相当灵活,经由适配器的处理后,在 view看来所有的数据映射过来都是一样的。
3.数据:具体的数据和资本。可所以字符串图片、Map映射等,经由过程适配器这些数据将会被实际到 ListView上。
    总之,所有的数据和资本要显示到ListView上都经由过程适配器来完成。ArrayAdapter,CursorAdapter, SimpleAdapter为体系已有的适配器,可以将如数组、Cursor指向的数据(一般为数据库)、Map里的数据。


二、深刻懂得Adapter
1.概要:Adapter是连接后端数据和前端视图显示的适配寡居口,是数据和UI(View)之间的桥梁。经由过程适配器,可以将不合的数据映射并显示到View上。在常见的View(ListView、GridView)等处所都须要用到Adapter。对于Data、Adapter、View的关系,如下图所示:
[img]http://img.blog.csdn.net/20150104172857879?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
2.Android中Adapter类
(1)BaseAdapter适配器:为一个抽象类,应用该类可以实现更为复杂的ListView。经由过程文档可以看出,ArrayAdapter,CursorAdapter, SimpleAdapter都持续于BaseAdapter。所以经由过程持续BaseAdapter就可以完成本身的Adapter,可以将任何复杂组合的数据和资本,以任何你想要的显示效不雅展示处理。持续BaseAdapter之后,须要重写以下四个办法:getCount,getItem,getItemId,getView。然则,ArrayAdapter,CursorAdapter, SimpleAdapter则无须要全部重写上述四种办法。
(2)ArrayAdapter适配器:支撑泛型操作,最为简单,只能展示一行字符串。
(3)SimpleAdapter适配器:有最好的扩充性,可以自定义出各类效不雅(字符串、图片、Map集),平日应用xml构造文件来指定视图。
(4)SimpleCursorAdapter适配器:可以实用于简单的纯文字型ListView,它须要Cursor的字段和UI的id对应起来。如须要实现更复杂的UI也可以重写其他办法。可以认为是SimpleAdapter对数据库的简单结合,可以便利地把数据库的内容以列表的情势展示出来。
[img]http://img.blog.csdn.net/20150104172917863?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

[img]http://blog.csdn.net/u012637501/article/details/42394937/file:/C:/Users/Jiangdongguo/AppData/Local/YNote/data/jiangdongguo2013@126.com/8c6f681bdb74433e80b77f7e7fa0919c/clipboard.png
3.ListView加载adapter一般过程
(1)先断定adapter有若干瘪据项,根据这个数据肯定有若干item(列表项). -----getCount()办法实现 
(2)肯定每个item里加载哪个View.                                     -----getView()办法实现
(3)向对应的View中加载须要显示的数据
4.ArrayAdapter实例分析
(1)开辟根本思路
    ArrayAdapter适配器支撑泛型操作,列表的每一项只能显示一串字符,不克不及显示图片等资本数据。
*应用字符串数组作为数据源
a.实现一个字符串数组作为数据源(List集)(数组元素有几个,就有几个列表项)
b.实例化一个ArrayAdapter<String> 适配器对象,用于装配数据源到指定的View.

ArrayAdapter<String> adapter=new ArrayAdapter<String>( this,android.R.layout.simple_expandable_list_item_1, strs); 
c.将ArrayAdapter实用于ListActivity的ListView
setListAdapter(adapter);

*应用List集合(ArrayList)作为数据源
a.实例化一个ListView对象
b.实例化一个ArrayAdapter<String>对象(集合中数据项类型为String),将Map集合中的数据项映射到列表项中;
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData()); 
c.装配Adapter到ListView中并显示ListView视图
listview.setAdapter(adapter); //装配Adapter到ListView
setContentView(listview); //将list视图显示
(2)源代码分析一
MainActivt.java
package com.example.android_arraylist_1;
mport android.app.ListActivity; 
import android.os.Bundle;
import android.widget.ArrayAdapter;

public class MainActivity extends ListActivity
{
     public void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);
      String[] strs={"第一项","第二项","第三项","第四项"}; //列表项数据
      ArrayAdapter<String> adapter=new ArrayAdapter<String>(  //实例化一个ArrayAdapter适配器来装配数据
            this, //高低文
            android.R.layout.simple_expandable_list_item_1, //列表的每一行构造,只显示一行文字
            strs); //数据源(一个List集合)
  setListAdapter(adapter); //将List集合数据显示在List视图中
 }
}
分析:
    膳绫擎代码应用了ArrayAdapter(Context context, int textViewResourceId, List<T> objects)来装配数据,要装拍┞封些数据就须要一个连接ListView视图对象和数组数据的适配器来两者的适配工作,ArrayAdapter的构造须要三个参数,依次为this,构造文件(留意这里的构造文件描述的昵嘈表的每一行的构造,android.R.layout.simple_list_item_1是体系定义好的构造文件只显示一行文字,数据源(一个List集合)。同时用setAdapter()完成适配的最后工作。
效不雅:
[img]http://blog.csdn.net/u012637501/article/details/42394937/file:/C:/Users/Jiangdongguo/AppData/Local/YNote/data/jiangdongguo2013@126.com/156392813d6b4f5caf91c08aa431dfa6/clipboard.png[img]http://img.blog.csdn.net/20150104172945740?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
    
(3)源码分析二
ArrayListActivity.java

package com.example.android_arraylist_2;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class ArrayListActivity extends Activity {
 private ListView listview; //定义一个ListView对象
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  listview =new ListView(this); //实例化一个ListView对象
  ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, //实例化一个适配器adapter
         android.R.layout.simple_expandable_list_item_1, //构造文件:显示一行文字
         getData()); //获取数据源(ArrayList集合)
  listview.setAdapter(adapter); //装配Adapter到ListView
  setContentView(listview); //将list视图显示
 
 }
 private List<String> getData() {
  // TODO Auto-generated method stub
  List<String> data=http://www.sjsjw.com/100/000269MYM030665/new ArrayList(); //实例化一个ArrayList集合,用于装载数据
  data.add("测试数据1"); //向ArrayList集合中添加元素数据
  data.add("测试数据2");
  data.add("测试数据3");
  data.add("测试数据4");
  return data; //返回ArrayList集合对象
 }
}
分析:
(1) getData()
(2) List<String> 
(3) List<String> data=http://www.sjsjw.com/100/000269MYM030665/new ArrayList()
效不雅:
[img]http://blog.csdn.net/u012637501/article/details/42394937/file:/C:/Users/Jiangdongguo/AppData/Local/YNote/data/jiangdongguo2013@126.com/38d11e5cd42c471fb98d66a64e3fe91f/clipboard.png[img]http://img.blog.csdn.net/20150104173014421?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center


5.SimpleAdapter实例分析
   与ArrayAdapter不合的是,simpleAdapter的扩大性最好,可以定义各类各样的构造出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。一般情况下,我们都是应用Map哈希表作为数据源,经由过程键到组件Id的映射实现列表项内容。

(1)开辟根本思路
a.装配适配器,将Map键数据资本竽暌钩射到Id所对应的组件上;

 SimpleAdapter adapter =new SimpleAdapter(this, //高低文
            getData(), //获取list数据集
            R.layout.simple, //指定构造文件
            new String[]{"img","title1","info"}, //Map集合键
            new int[]{R.id.img,R.id.title1,R.id.info});//界面组件Id
b.实现一个Map集合,并将map对象添加ArrayList中

 List<Map<String,Object>> list=new ArrayList<Map<String,Object>>(); //实例化一个ArrayList对象,
 Map<String,Object> map=new HashMap<String,Object>(); //设置列表第一项标题与搁笔(应用Map)
c.将ArrayAdapter实用于ListActivity的ListView
 setListAdapter(adapter);

(2)源代码分析
SimpleAdapterActivity.java

package com.example.android_sampleadapter_1;
import java.util.ArrayList; 
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.ListActivity; 
import android.os.Bundle;
import android.widget.SimpleAdapter;
public class SimpleAdapterActivity extends ListActivity { 

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
 //1.装配适配器,并绑定命据到响应的视图
  SimpleAdapter adapter =new SimpleAdapter(this, //高低文
            getData(), //获取list数据集
            R.layout.simple, //指定构造文件
            new String[]{"img","title1","info"}, //Map集合键
            new int[]{R.id.img,R.id.title1,R.id.info});//界面组件Id
 //2.显示视图
  setListAdapter(adapter);
 }
 //3.Map数据集:HashMap构成的List,list的每一节对应ListView的每一行
  //HashMap的每个键值数据映射到构造文件中对应id的组件上
 private List<Map<String,Object>> getData() {
  // TODO Auto-generated method stub
  List<Map<String,Object>> list=new ArrayList<Map<String,Object>>(); //实例化一个ArrayList对象,
  Map<String,Object> map=new HashMap<String,Object>(); //设置列表第一项标题与搁笔(应用Map)
  map.put("img", R.drawable.a);
  map.put("title1", "华为光荣");
  map.put("info", "学人家玩抢购,真TM坑爹!");
  list.add(map); //将一个map对象添加到列表中
 
  map=new HashMap<String,Object>();
  map.put("img", R.drawable.b);
  map.put("title1", "中国移动");
  map.put("info", "god knows");
  list.add(map); //将一个map对象添加到列表中
 
  map=new HashMap<String,Object>();
  map.put("img", R.drawable.c);
  map.put("title1", "中兴");
  map.put("info", "手机还不错,只是要逝世不活的");
  list.add(map); //将一个map对象添加到列表中
 
  map=new HashMap<String,Object>();
  map.put("img", R.drawable.d);
  map.put("title1", "魅族4");
  map.put("info", "有点贵!");
  list.add(map); //将一个map对象添加到列表中
 
  return list;
 }

分析:

    应用simpleAdapter的数据用一般都是HashMap构成的List,list的每一节对应ListView的每一行。HashMap的每个键值数据映射到构造文件中对应id的组件上。因为体系没有对应的构造文件可用,我们可以本身定义一个构造simple.xml。下面做适配,new一个SimpleAdapter参数一次是:this,构造文件(vlist.xml),HashMap的 title 和 info,img,构造文件的组件id,title,info,img。构造文件的各组件分别映射到HashMap的各元素上,完成适配。
simple.xml-列表项构造文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:orientation="horizontal" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 
<ImageView 
android:id="@+id/img" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_margin="10dp"/> 
<LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> 
<TextView 
android:id="@+id/title1" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:textColor="#FF000000" android:textSize="22sp"/> 
<TextView 
android:id="@+id/info" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:textColor="#FF000000" android:textSize="13sp"/> 
</LinearLayout> 
</LinearLayout> 

[img]http://img.blog.csdn.net/20150104173029171?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
6.SimpleAdapter实例分析

package com.example.android_simplecuroradapter;

import android.app.ListActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.Contacts.People;
import android.support.v4.widget.SimpleCursorAdapter;
import android.widget.ListAdapter;

public class SimpleCursorActivity extends ListActivity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  //1.获得一个指向体系通信录数据库的CurSor对象获得数据来源
  Cursor cur=getContentResolver().query(People.CONTENT_URI, null, null, null, null);
  startManagingCursor(cur);
  //2.实例化列表适配器
  ListAdapter adapter=new SimpleCursorAdapter(this,android.R.layout.simple_expandable_list_item_1,cur,new String[] {People.NAME},new int[] {android.R.id.text1});
  //3.显示视图
  setListAdapter(adapter);
 }
}
分析:
    必定要以数据库作为数据源的时刻,才能应用SimpleCursorAdapter,这里特别须要留意的一点是:不要忘了在AndroidManifest.xml文件中参加权限
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
效不雅:
[img]http://img.blog.csdn.net/20150104173025270?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

[img]http://blog.csdn.net/u012637501/article/details/42394937/file:/C:/Users/Jiangdongguo/AppData/Local/YNote/data/jiangdongguo2013@126.com/af561294048d44c59f1f6a1280fea6f1/clipboard.png
参考:
1.http://www.cnblogs.com/Gaojiecai/archive/2012/10/08/2715962.html
2.http://wenku.baidu.com/link?url=1ln6lAvzN9E-1eOuEfy2E_i1O0Ws8gE0KcySX-yu-j7wEzgd1EkuDhwcfeCcM48egMIFb-Egm7mh1RODs9hkXw8C1zjqNkIa4lyvH5oliHO
3.http://wenku.baidu.com/view/0224ead8ad51f01dc281f141.html




相关案例查看更多