布局文件Android ListView入门知识--各种Adapter配合使用

news/2024/6/19 8:41:28

PS:今天上午,非常郁闷,有很多简略基础的问题搞得我有些迷茫,哎,代码几天不写就忘。目前又不当COO,还是得用心记代码哦!

    

    

在Android开发中ListView是比较经常使用的组件,它以列表的情势展示详细内容,并且可以根据数据的长度自适应表现。

    

列表的表现须要三个元素:

    

1.ListVeiw 用来展示列表的View。

    

2.适配器 用来把数据映射到ListView上的中介。

    

3.数据    详细的将被映射的字符串,图片,或者基本组件。

    

根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter

    

其中以ArrayAdapter最为简略,只能展示一行字。SimpleAdapter有最好的扩充性,可以自定义出各种效果。SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简略结合,可以方面的把数据库的内容以列表的情势展示出来。

个人认为从SimpleAdapter开始学习效果较好.......

    

=====================================================================

    

我们从最简略的ListView开始---ArrayAdapter

    

 public class MyListView extends Activity {private ListView listView;//private List<String> data = new ArrayList<String>();@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);listView = new ListView(this);listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData()));setContentView(listView);}private List<String> getData(){List<String> data = new ArrayList<String>();data.add("测试数据1");data.add("测试数据2");data.add("测试数据3");data.add("测试数据4");return data;}}


 

    

下面代码应用了ArrayAdapter(Context context, int textViewResourceId, List<T> objects)来装配数据,要装配这些数据就须要一个连接ListView视图对象和数组数据的适配器来两者的适配工作,ArrayAdapter的结构须要三个参数,依次为this,布局文件(注意这里的布局文件描述的是列表的每一行的布局,android.R.layout.simple_list_item_1是系统定义好的布局文件只表现一行文字,数据源(一个List集合)。同时用setAdapter()完成适配的最后工作。

    

运行后的现实结构如下图:

    

布局和文件

    

===========================================================

    

SimpleCursorAdapter

    

skd的解释是这样的:An easy adapter to map columns from a cursor to TextViews or ImageViews defined in an XML file. You can specify which columns you want, which views you want to display the columns, and the XML file that defines the appearance of these views。简略的说就是方便把从游标得到的数据进行列表表现,并可以把指定的列映射到对应的TextView中。

    

下面的程序是从电话簿中把联系人表现到类表中。先在通讯录中添加一个联系人作为数据库的数据。然后获得一个指向数据库的Cursor并且定义一个布局文件(当然也可以应用系统自带的)。

    

 public class MyListView2 extends Activity {private ListView listView;//private List<String> data = new ArrayList<String>();@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);listView = new ListView(this);Cursor cursor = getContentResolver().query(People.CONTENT_URI, null, null, null, null);startManagingCursor(cursor);ListAdapter listAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_expandable_list_item_1,cursor,new String[]{People.NAME},new int[]{android.R.id.text1});listView.setAdapter(listAdapter);setContentView(listView);}}


 

    

Cursor cursor = getContentResolver().query(People.CONTENT_URI, null, null, null, null);先获得一个指向系统通讯录数据库的Cursor对象获得数据来源。

    

startManagingCursor(cursor);我们将获得的Cursor对象交由Activity管理,这样Cursor的生命周期和Activity便可以主动同步,省去自己手动管理Cursor。

    

注意:须要在AndroidManifest.xml中如权限:<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>

    

SimpleCursorAdapter 结构函数前面3个参数和ArrayAdapter是一样的,最后两个参数:一个包含数据库的列的String型数组,一个包含布局文件中对应组件id的int型数组。其作用是主动的将String型数组所表示的每一列数据映射到布局文件对应id的组件上。下面的代码,将NAME列的数据一次映射到布局文件的id为text1的组件上。

    

运行后效果如下图:

    

布局和文件

    

===================================================================

    

SimpleAdapter

    

simpleAdapter的扩展性最好,可以定义林林总总的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。下面的代码都直接继承了ListActivity,ListActivity和普通的Activity没有太大的差异,不同就是对表现ListView做了许多优化,方面表现而已。

    

下面的程序是实现一个带有图片的类表。

    

首先须要定义好一个用来表现每个列内容的xml

    

vlist.xml

    

?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal" android:layout_width="fill_parent"android:layout_height="fill_parent"><ImageView android:id="@+id/img"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="5px"/><LinearLayout android:orientation="vertical"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextView android:id="@+id/title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#FFFFFFFF"android:textSize="22px" /><TextView android:id="@+id/info"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#FFFFFFFF"android:textSize="13px" /></LinearLayout></LinearLayout>



下面是实现代码:

 public class MyListView3 extends ListActivity {// private List<String> data = new ArrayList<String>();@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);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});setListAdapter(adapter);}private List<Map<String, Object>> getData() {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);map = new HashMap<String, Object>();map.put("title", "G2");map.put("info", "google 2");map.put("img", R.drawable.i2);list.add(map);map = new HashMap<String, Object>();map.put("title", "G3");map.put("info", "google 3");map.put("img", R.drawable.i3);list.add(map);return list;}}


每日一道理
聪明人学习,像搏击长空的雄鹰,仰视一望无际的大地;愚笨的人学习,漫无目的,犹如乱飞乱撞的无头飞蛾;刻苦的人学习,像弯弯的河流,虽有曲折,但终会流入大海;懒惰的人学习,像水中的木头,阻力越大倒退得越快。

应用simpleAdapter的数据用一般都是HashMap形成的List,list的每一节对应ListView的每一行。HashMap的每个键值数据映射到布局文件中对应id的组件上。因为系统没有对应的布局文件可用,我们可以自己定义一个布局vlist.xml。下面做适配,new一个SimpleAdapter参数一次是:this,布局文件(vlist.xml),HashMap的 title 和 info,img。布局文件的组件id,title,info,img。布局文件的各组件分别映射到HashMap的各元素上,完成适配。

    

运行效果如下图:

    

布局和文件

    

========================================================================

    

有按钮的ListView---重写继承BaseAdapter

    

但是有时候,列表不光会用来做表现用,我们同样可以在在下面添加按钮。添加按钮首先要写一个有按钮的xml文件,然后自然会想到用下面的方法定义一个适配器,然后将数据映射到布局文件上。但是现实并非这样,因为按钮是无法映射的,即使你成功的用布局文件表现出了按钮也无法添加按钮的响应,这时就要研究一下ListView是如何现实的了,而且必须要重写一个类继承BaseAdapter。下面的示例将表现一个按钮和一个图片,两行字如果单击按钮将删除此按钮的所在行。并告诉你ListView究竟是如何工作的。

    

效果如下:

    

布局和文件

    

vlist2.xml

    

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="fill_parent"><ImageView android:id="@+id/img"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="5px"/><LinearLayout android:orientation="vertical"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextView android:id="@+id/title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#FFFFFFFF"android:textSize="22px" /><TextView android:id="@+id/info"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#FFFFFFFF"android:textSize="13px" /></LinearLayout><Button android:id="@+id/view_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/s_view_btn"android:layout_gravity="bottom|right" /></LinearLayout>

 



程序代码:

public class MyListView4 extends ListActivity {private List<Map<String, Object>> mData;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mData = getData();MyAdapter adapter = new MyAdapter(this);setListAdapter(adapter);}private List<Map<String, Object>> getData() {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);map = new HashMap<String, Object>();map.put("title", "G2");map.put("info", "google 2");map.put("img", R.drawable.i2);list.add(map);map = new HashMap<String, Object>();map.put("title", "G3");map.put("info", "google 3");map.put("img", R.drawable.i3);list.add(map);return list;}// ListView 中某项被选中后的逻辑@Overrideprotected void onListItemClick(ListView l, View v, int position, long id) {Log.v("MyListView4-click", (String)mData.get(position).get("title"));}/*** listview中点击按键弹出对话框*/public void showInfo(){new AlertDialog.Builder(this).setTitle("我的listview").setMessage("分析...").setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}}).show();}public final class ViewHolder{public ImageView img;public TextView title;public TextView info;public Button viewBtn;}public class MyAdapter extends BaseAdapter{private LayoutInflater mInflater;public MyAdapter(Context context){this.mInflater = LayoutInflater.from(context);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn mData.size();}@Overridepublic Object getItem(int arg0) {// TODO Auto-generated method stubreturn null;}@Overridepublic long getItemId(int arg0) {// TODO Auto-generated method stubreturn 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {holder=new ViewHolder();convertView = mInflater.inflate(R.layout.vlist2, null);holder.img = (ImageView)convertView.findViewById(R.id.img);holder.title = (TextView)convertView.findViewById(R.id.title);holder.info = (TextView)convertView.findViewById(R.id.info);holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);convertView.setTag(holder);}else {holder = (ViewHolder)convertView.getTag();}holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));holder.title.setText((String)mData.get(position).get("title"));holder.info.setText((String)mData.get(position).get("info"));holder.viewBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {showInfo();               }});return convertView;}}}


下面将对上述代码,做详细的解释,listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listView的长度(这也是为什么在开始的第一张图特别的标出列表长度),然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,列表将不表现同样return 1,就只表现一行。

    

系统表现列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必须手动映射数据,这须要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position表示将表现的是第几行,covertView是从布局文件中inflate来的布局。我们用LayoutInflater的方法将定义好的vlist2.xml文件提取成View实例用来表现。然后将xml文件中的各个组件实例化(简略的findViewById()方法)。这样便可以将数据对应到各个组件上了。但是按钮为了响应点击事件,须要为它添加点击监听器,这样就可以捕获点击事件。至此一个自定义的listView就完成了,现在让我们回过火从新审阅这个进程。系统要绘制ListView了,他首先获得要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里头首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,表现之。好了,绘制完这一行了。那再绘制下一行,直到绘完为止。在实际的运行进程中会发明listView的每一行没有焦点了,这是因为Button抢夺了listView的焦点,只要布局文件中将Button设置为没有焦点就OK了。

    

布局和文件

文章结束给大家分享下程序员的一些笑话语录: 程序员喝酒
  我偶尔采用“木马策略”、“交叉测试”,时间不长就开始“频繁分配释放资源”,“cache”也是免不了的了,
  不过我从不搞“轮巡”,也不会“捕获异常”,更不会“程序异常”,因为我有理性
克制的。  

转载于:https://www.cnblogs.com/xinyuyuanm/archive/2013/05/20/3089357.html


https://dhexx.cn/news/show-18596.html

相关文章

linux 用户管理与组管理

Linux是一个多用户、多任务的操作系统 linux用户的分类&#xff1a; 超级用户root&#xff1a;拥有至高无上的权限 UID&#xff1a;0 普通用户&#xff1a;权限有一定的限制&#xff0c;可以登录系统。一般可以执行/usr/local/bin或者/bin或者/usr/bin或者自己家目录的…

输入一个四位数将其加密后输出c语言,从键盘输入一个四位数-按如下规则加密后输出...

《从键盘输入一个四位数-按如下规则加密后输出》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《从键盘输入一个四位数-按如下规则加密后输出(3页珍藏版)》请在人人文库网上搜索。1、作业31、 从键盘输入一个四位数&#xff0c;按如下规则加密后输出。加密规则&#x…

dom4j解析xml字符串实例[转]

DOM4J 与利用DOM、SAX、JAXP机制来解析xml相比&#xff0c;DOM4J 表现更优秀&#xff0c;具有性能优异、功能强大和极端易用使用的特点&#xff0c;只要懂得DOM基本概念&#xff0c;就可以通过dom4j的api文档来解析xml。dom4j是一套开源的api。实际项目中&#xff0c;往往选择d…

C++ 21 set容器

目录 一、set容器 1.1 简介 1.2 构造和赋值 1.3 大小和交换 1.4 插入和删除 1.5 查找和统计 1.6 set和multiset区别 1.7 内置类型指定排序规则 1.8 自定义数据类型指定排序规则 一、set容器 1.1 简介 ① set容器中所有元素在插入时自动被排序。 ② set容器和multise…

linux系统 文件属性和权限更改--

文件的属性&#xff1a;ls -lrti 135088935 -rw-------. 1 root root 1778 Oct 1 2020 yum.log 第一列&#xff1a;i节点&#xff1b;i节点可以理解文件id&#xff0c;一个i节点号可以对应多个文件&#xff0c;一个文件只能对应一个i节点号 第二列&#xff1a;文件的类型与权限…

cug上的几道dp题

题目链接&#xff1a;http://acm.cug.edu.cn/JudgeOnline/problem.php?id1317 思路&#xff1a;dp[i][j]表示以a[i]为结尾的串与以b[j]为结尾的串的最小编辑距离&#xff0c;则 若a[i]a[j],有dp[i][j]dp[i-1][j-1]; 否则dp[i][j]min{dp[i-1][j-1]2,dp[i-1][j]3,dp[i][j-1]3} 1…

TableLayoutPanel居中和单元格内元素居中

在后台程序新建一个TableLayoutPanel 添加到form中&#xff0c;默认显示在左上角&#xff0c;想了很多让它居中的办法&#xff0c;在网上找了不少 最好的是&#xff1a; winform要设置控件的位置有3种&#xff1a; 1.控件的anchor属性属性&#xff0c;&#xff0c;瞄定。。。。…

图像拼接的c语言程序,c – 使用OpenCV进行图像拼接细节

这确实是一个非常有趣的问题.正如hatboyzero指出的那样,变量的含义相当简单&#xff1a;> Nm是匹配的数量(在重叠区域中,因此已经删除了明显的异常值).> Ni是找到Ransac单应性后的​​内部数.> C是两张图像匹配的信心.匹配的背景通过在所有图像中找到兴趣点并为它们计…

linux系统 文件归档与解压缩--

文件归档&#xff1a; 文件归档也称之为打包&#xff0c;指的是一个文件或者多个文件或者目录的一个集合&#xff0c;这个集合储存在一个文件中。 归档文件是没有进行压缩的&#xff0c;所以占用的空间是所有文件或者目录的总和。 工作中经常与压缩结合在一起使用 …

微信小程序语言c#,微信小程序推出最新脚本语言WXS,你需要知道的全在这里了...

原标题&#xff1a;微信小程序推出最新脚本语言WXS&#xff0c;你需要知道的全在这里了感谢“造程序”(微信ID&#xff1a;zaochengxucom)的授权发布。责编&#xff1a;陈秋歌&#xff0c;关注微信开发等领域&#xff0c;寻求报道或者投稿请发邮件至chenqg#csdn.net。WXS脚本语…