Android杂谈--ListView之SimpleAdapter的使用
SimpleAdapter
SimpleAdapter是扩展性最好的适配器,可以定义各种你想要的布局,而且使用很方便
SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
参数context:上下文,比如this。关联SimpleAdapter运行的视图上下文
参数data:Map列表,列表要显示的数据,这部分需要自己实现,如例子中的getData(),类型要与上面的一致,每条项目要与from中指定条目一致
参数resource:ListView单项布局文件的Id,这个布局就是你自定义的布局了,你想显示什么样子的布局都在这个布局中。这个布局中必须包括了to中定义的控件id
参数 from:一个被添加到Map上关联每一个项目列名称的列表,数组里面是列名称
参数 to:是一个int数组,数组里面的id是自定义布局中各个控件的id,需要与上面的from对应
SimpleAdapter可以使用自定义的ListView,然后setContentView即可。也可以直接使用系统自带的ListAcitivity,该ListActivity实现了ListView,显示ListView的时候做了很多优化。
ListActivity直接extends ListActivity即可,不需要在setContentView了
例子一:自定义布局,显示本地资源
如果直接继承ListAcitivty,则不需要自定义ListView,下面的是列表项单项显示格式
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="3px" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="16sp" /> <TextView android:id="@+id/info" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="10sp" /> </LinearLayout> </LinearLayout>
Activity
package com.loulijun.demo13; 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 Demo13Activity extends ListActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SimpleAdapter adapter = new SimpleAdapter(this, getData(), R.layout.main, new String[] { "img", "title", "info" }, new int[] { R.id.img, R.id.title, R.id.info }); 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("img", R.drawable.e001); map.put("title", "小宗"); map.put("info", "电台DJ"); list.add(map); map = new HashMap<String, Object>(); map.put("img", R.drawable.e002); map.put("title", "貂蝉"); map.put("info", "四大美女"); list.add(map); map = new HashMap<String, Object>(); map.put("img", R.drawable.e04b); map.put("title", "奶茶"); map.put("info", "清纯妹妹"); list.add(map); map = new HashMap<String, Object>(); map.put("img", R.drawable.e04e); map.put("title", "大黄"); map.put("info", "是小狗"); list.add(map); map = new HashMap<String, Object>(); map.put("img", R.drawable.e11a); map.put("title", "hello"); map.put("info", "every thing"); list.add(map); map = new HashMap<String, Object>(); map.put("img", R.drawable.e11d); map.put("title", "world"); map.put("info", "hello world"); list.add(map); return list; } }
|------------------------------华丽的分割线------------------------------------------|
注:自定义ListView也有其好处,因为继承的ListAcitivity布局的样子已经定了下来,但是如果我们需要在ListView中实现某些效果,比如快速滚动条,就需要自定义了。另外如果你继承的比如是TabActivity等其他
Acitivty的话,就不能继承ListAcitivty了,因为JAVA是单继承,这时候还是需要自定义的ListView
如果自定义ListView而不是继承ListActivity需要如下样子实现
mylist.xml,在ListView中可以定义其他属性
<?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="vertical" > <ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="wrap_content" ></ListView> </LinearLayout>
如果使用自定义的ListView就需要在上面的代码修改一下下了,Acitivity其他部分都一样,区别在于灰色区域
public class Demo13Activity extends Activity { private ListView lv; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mylist); lv = (ListView)findViewById(R.id.listview); SimpleAdapter adapter = new SimpleAdapter(this, getData(), R.layout.main, new String[] { "img", "title", "info" }, new int[] { R.id.img, R.id.title, R.id.info }); //setListAdapter(adapter); lv.setAdapter(adapter); }
运行效果如下:
|------------------------------------------------------------------------|
用户可以自定义布局,可以是线性布局,也可以是网格布局等等
接下来说说ViewBinder的使用,上面的例子中我们显示了本地资源,图片都是保存在本地的,但是用上面的方法显示网络上获取的图片却有问题,因为如果ListView要显示外部资源的话必须要设置ViewBinder,通过ViewBinder的绑定机制来显示网络资源,下面是个显示网络图片的例子(如果可能的话,最好还是使用BaseAdapter)
例子二:自定义布局,显示网络资源,ViewBinder的使用
由于需要访问网络资源,首先在你的清单文件中加入权限
<uses-permission android:name="android.permission.INTERNET"/>
其他布局跟上面一样
package com.loulijun.demo13; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.view.View; import android.widget.ImageView; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.SimpleAdapter.ViewBinder; public class Demo13Activity extends Activity { private ListView lv; private static final String iphoneUrl = "http://www.51aigoo.com/images/20100107/6b21df8c2419480e.jpg"; private static final String macbookproUrl = "http://www.esundigi.net/images/goods/20110317/6ece8f319694f0b1.jpg"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mylist); lv = (ListView)findViewById(R.id.listview); SimpleAdapter adapter = new SimpleAdapter( this, getData(), R.layout.main, new String[] {"img","title","info"}, new int[] { R.id.img, R.id.title, R.id.info}); //setListAdapter(adapter); adapter.setViewBinder(new MyViewBinder()); lv.setAdapter(adapter); } //获取网络图片资源,返回类型是Bitmap,用于设置在ListView中 public Bitmap getBitmap(String httpUrl) { Bitmap bmp = null; //ListView中获取网络图片 try { URL url = new URL(httpUrl); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); InputStream is = conn.getInputStream(); bmp = BitmapFactory.decodeStream(is); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return bmp; } //ListView上需要显示的数据 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("img", getBitmap(iphoneUrl)); map.put("title", "iphone4"); map.put("info", "可远观而买不起嫣"); list.add(map); map = new HashMap<String, Object>(); map.put("img", getBitmap(macbookproUrl)); map.put("title", "Macbook pro"); map.put("info", "明年买个玩玩"); list.add(map); return list; } } //实现ViewBinder接口 class MyViewBinder implements ViewBinder { /** * view:要板顶数据的视图 * data:要绑定到视图的数据 * textRepresentation:一个表示所支持数据的安全的字符串,结果是data.toString()或空字符串,但不能是Null * 返回值:如果数据绑定到视图返回真,否则返回假 */ @Override public boolean setViewValue(View view, Object data, String textRepresentation) { if((view instanceof ImageView)&(data instanceof Bitmap)) { ImageView iv = (ImageView)view; Bitmap bmp = (Bitmap)data; iv.setImageBitmap(bmp); return true; } return false; } }
运行结果:
文章精选:
农民伯伯:http://www.cnblogs.com/over140/archive/2010/11/24/1886151.html
http://www.cnblogs.com/over140/archive/2010/12/15/1906303.html
ViewBinder解决方案:http://www.anddev.org/listview_simpleadapter_and_bitmaps_-_bug_-t11817.html
相关推荐
ListView使用simpleAdapter填充实现,数据结构是HashMap,对应的我的博客地址是: http://blog.csdn.net/u012320459/article/details/47667869
android-world-of-listview-android
Android-react-native-timeline-listview.zip,React本机应用程序的时间线组件,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核之上构建的,具有安全性优势。
android-pulltorefresh-listview 下拉刷新ListView
ListView和SimpleAdapter的简单应用
It works in all version of Android and it's very easy to adapt to your project. How to use with Gradle Simply add the repository to your build.gradle file: repositories { jcenter() maven { url '...
drag-sort-listview是一个支持拖拽排序和左右滑动删除功能的自定义ListView.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
•Android---UI篇---Tab Layout(选项卡布局) • •Andorid---UI篇---TableLayout(表格布局) ...•Android---UI篇---ListView之SimpleCursorAdapter(列表)---3 • •Android---UI篇---Menu(菜单)
SimpleAdater 简单适配器 配合listView使用 ,将数据展示在列表中 进阶1
2-android-pulltorefresh-listview 下拉刷新ListView.zip
react-native-sortable-listview, ListView的拖放功能包装,用于响应本机 react-native-sortable-listviewListView的拖放功能包装,用于响应本机。 拖动时允许拖放自动滚动行。将它添加到你的项目中运行 npm install...
Android开发笔记---ListView
Android--开发--ListView上下翻页效果
Android--开发-- ListView下拉刷新 Demo
Android中尝试气泡短信编程初探实例 ListView使用SimpleAdapter适配器详解 具体参考小魏博客:http://blog.csdn.net/xiaowei_cqu/article/details/7045497
21.[开源][安卓][拖拽]drag-sort-listview-master DragSortListView(DSLV)是Android ListView的一个扩展,支持拖拽排序和左右滑动删除功能。重写了TouchInterceptor(TI)类来提供更加优美的拖拽动画效果。 DSLV...
Android--开发--ListView 中的item随意拖动
android-pro-listview.7z
android-custom-listview.7z
Android--开发--ListView 实现点击侧边A-Z快速查找