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"/><TextViewandroid: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. */@Overridepublic 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;@Overridepublic 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";@Overridepublic 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* 返回值:如果数据绑定到视图返回真,否则返回假*/@Overridepublic 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

Android杂谈--ListView之SimpleAdapter的使用相关推荐

  1. Android杂谈--ListView之BaseAdapter的使用

    Android杂谈--ListView之BaseAdapter的使用 前言 话说开发用了各种Adapter之后感觉用的最舒服的还是BaseAdapter,尽管使用起来比其他适配器有些麻烦,但是使用它却 ...

  2. Android杂谈--ListView之ArrayAdapter的使用

    Android杂谈--ListView之ArrayAdapter的使用 ArrayAdapter 总是感觉写自己的博客才更能够学到东西,网上尽管有很多好的资料,但是参差不齐,需要浪费大量时间才能够找到 ...

  3. Android杂谈--ListView之BaseAdapter的使用一(转)

    BaseAdapter是直接继承自接口类Adapter的,使用BaseAdapter时需要重写很多方法      BaseAdapter与其他Adapter有些不一样,其他的Adapter可以直接在其 ...

  4. Android杂谈--ListView之BaseAdapter的使用二(转)

    实例二:Gallery上应用BaseAdapter main.xml <?xml version="1.0" encoding="utf-8"?> ...

  5. Android的ArrayAdapter、SimpleAdapter、BaseAdapter与ListView的使用

    工程目录: MainActivity package com.example.demo_four;import androidx.appcompat.app.AppCompatActivity;imp ...

  6. Android Studio ListView+SimpleAdapter使用之仿酷狗界面

    写博客的目的在于分享,更是为了积累项目经验.博客亦是一本武功秘籍,回头哪个招式忘了怎么耍,也好对照参考.这篇文章是对ListView,SimpleAdapter以及ListView监听事件的使用详解, ...

  7. Android使用ListView控件问题

    Android使用ListView控件问题: The application has stopped unexpectedly, please try again. 开发环境:android 1.6 ...

  8. ListView之SimpleAdapter的使用

    2019独角兽企业重金招聘Python工程师标准>>> SimpleAdapter是扩展性最好的适配器,可以定义各种你想要的布局,而且使用很方便 SimpleAdapter(Cont ...

  9. Android DrawLayout + ListView 的使用(一)

    想做一个APP,设计中有侧边栏这个功能,所以现在开始学习下侧边栏的实现. 在官方的UI空间中已经给出了DrawerLayout这个侧滑的菜单空间. 因为在使用DrawerLayout的时候遇到了些问题 ...

最新文章

  1. Lint found fatal errors while assembling a release target.
  2. linux swap 内存交换分区调整
  3. winsock 函数声明大全
  4. Fedora设置DVD为yum源
  5. 吕梁离石学校计算机专业在哪里,山西吕梁计算机大专学校有哪些太重技校告诉您...
  6. Js引擎解析执行 阅读笔记
  7. Sublime Text设置快捷键让html文件在浏览器打开
  8. unity打包android 乱码,Unity3d发布IOS9应用时出现中文乱码的解决方法
  9. windows下开启 PHP扩展Redis
  10. PostgreSQL SQL OUTLINE插件sr_plan (保存、篡改、固定 执行计划)
  11. Jenkins 学习总结(8)—— Jenkins X 入门实践
  12. HTC Vive凭什么在十分钟内获得1.5万的订单?
  13. Failed to parse PID from file /run/nginx.pid: Invalid argument
  14. centos运行C程序
  15. 清涟基因--顾大夫工作室相关网站
  16. tp3.2 URL生成
  17. Neo4j下载安装以及Neo4j浏览器详细说明
  18. 基于itext的pdf拼接
  19. 知乎周源微信_每周源代码34-F#的兴起
  20. 二叉树、二叉搜索树,平衡二叉树(旋转)红黑树(红黑规则)

热门文章

  1. 计算年龄案例(JS)
  2. 递增运算符练习(JS)
  3. 微信小程序中base64图片的显示与保存
  4. python字典元素的值是否相等_对Python中等值和大小比较
  5. python使用rpa需要什么插件_使用Python制作ArcGIS插件基础篇——工具介绍
  6. adb一打开就闪退_记一次龙骨动画导致Android版闪退过程
  7. spring mvc: xml练习
  8. onCreate onStart onResume onStop onPause onDestroy onRestart onWindowFocusChanged
  9. 计蒜客——回文平方数
  10. JMeter 检查点之响应断言(Response Assertion)