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

news/2023/9/27 6:35:36

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

相关文章

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

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

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…

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

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

Preference+PreferenceArray+DataModel

在Mahout中&#xff0c;用户的喜好被抽象为一个Preference&#xff0c;包含了userId&#xff0c;itemId和偏好值&#xff08;user对item的偏好&#xff09;。Preference是一个接口&#xff0c;它有一个通用的实现是GenericPreference。 因为用户的喜好数据是大规模的&#xff0…

android 向js传递参数,《成为大前端》系列 4.4 Native与JS通信-参数传递和结果返回(Android)...

JS 传递参数到 Native前面完成了 JS 调用 Native&#xff0c;接下来继续 JS 如何传递参数到 Native传递原始类型数据先看 JS 端的代码&#xff1a;function onClickButton(){window.androidBridge.callNative("Hello");}复制代码Native 端&#xff1a;inner class Br…

2013第四届 蓝桥杯c/c++B组预赛 解题报告(还在更新中。。。。。)

大半部分题目都是自己做的&#xff0c;可能还有存在错误的地方&#xff0c;还望各位指正。 有不会的题目&#xff0c;还请大牛们留下解题思路&#xff0c;谢谢了。 第一题&#xff1a;高斯日记 大数学家高斯有个好习惯&#xff1a;无论如何都要记日记。他的日记有个与众不同的地…

android读取多行文件,Android 读取txt,按行读取的实例讲解

Android 读取txt,按行读取的实例讲解发布时间&#xff1a;2020-09-12 12:43:31来源&#xff1a;脚本之家阅读&#xff1a;103作者&#xff1a;Damionew一个TXT 文件 对其进行读取&#xff0c;并且每行都单个存储读取public class MainActivity extends AppCompatActivity {priv…

Java简单游戏开发之碰撞检测

前言 不久之前在论坛上有人发贴&#xff0c;使用java编写的超级马里奥如何实现碰撞检测&#xff0c;笔者自己以前 也做过Tank大战。里面同样涉及到碰撞检测&#xff0c;翻翻U盘里的东西还在&#xff0c;什么时候也给共享出来。 这篇文章就简单游戏中的碰撞检测做一个简单的总结…

通用用户权限管理系统组件V3.9功能改进说明 - 操作权限项定义简化

在通用权限管理系统组件V3.9中对操作权限项定义进行了一次大胆的简化&#xff0c;现在定义模块菜单的同时可以定义操作权限项目&#xff0c;这样不用菜单与操作权限分离了&#xff0c;可以集中展示&#xff0c;实用效果更加友善。 下面是定义菜单或者操作权限项目的参考页面 设…

html 10 margin 重叠

留意&#xff0c;父子元素&#xff0c;margin重叠影响的是margin-top上的。取两者中的最大值&#xff0c;水平和bottom不受影响&#xff0c; 重叠的时候子元素的margin-top消失 父元素如果加了padding属性&#xff0c;不会重叠。子元素如果有float&#xff0c;父子不重叠 CSS 外…