`

Android杂谈--ListView之SimpleAdapter的使用

阅读更多

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

分享到:
评论

相关推荐

    Android ListView使用SimpleAdapter示例

    ListView使用simpleAdapter填充实现,数据结构是HashMap,对应的我的博客地址是: http://blog.csdn.net/u012320459/article/details/47667869

    Android应用源码之drag-sort-listview-master.rar

    通过研究`drag-sort-listview-master`的源码,开发者不仅可以学习到拖放排序的实现,还可以深入了解Android ListView的工作原理,以及如何优雅地处理触摸事件和视图更新。这对于提升个人的Android开发技能,特别是...

    android-listView-SimpleAdapter-进阶1.rar

    SimpleAdapter是Android提供的一种简单易用的适配器,它可以帮助开发者将数据集(如数组或列表)绑定到ListView上,使得数据能够以列表的形式展示给用户。本教程将深入探讨如何使用SimpleAdapter来实现ListView的...

    pinned-section-listview-master

    标题 "pinned-section-listview-master" 指的是一款仿照MIUI7文件管理器中“最近”功能的ListView实现,它特别强调了在ListView头部存在可以固定的分类。这个项目可能是一个开源Android开发示例,旨在帮助开发者创建...

    Android-react-native-timeline-listview.zip

    Android-react-native-timeline-listview.zip,React本机应用程序的时间线组件,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核之上构建的,具有安全性优势。

    ListView和SimpleAdapter的简单应用

    本篇文章将深入探讨ListView和SimpleAdapter的基本使用以及它们在实际应用中的结合。 ### 1. ListView简介 ListView是Android SDK提供的一种可以显示多行、多列数据的视图控件,适用于数据列表的展示。它的主要特点...

    Android代码-Animated-Expanding-ListView

    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 '...

    Android---UI篇

    •Android---UI篇---Tab Layout(选项卡布局) • •Andorid---UI篇---TableLayout(表格布局) ...•Android---UI篇---ListView之SimpleCursorAdapter(列表)---3 • •Android---UI篇---Menu(菜单)

    drag-sort-listview

    在"drag-sort-listview-master"这个压缩包中,你应该能找到项目的源代码、示例应用、README文件以及如何集成和使用的详细说明。通过研究这些内容,你可以深入理解该库的工作原理,并根据项目需求进行定制。对于希望...

    android-pulltorefresh-listview 下拉刷新ListView

    `android-pulltorefresh-listview`是一个专为ListView实现下拉刷新效果的开源库。这个库使得开发者能够轻松地将下拉刷新功能集成到他们的应用中,提高了用户体验。 首先,我们来看看`ListView`。ListView是Android ...

    android-pulltorefresh-listview

    `android-pulltorefresh`是一个广泛使用的开源库,它为ListView提供了优雅的下拉刷新效果,极大地提升了应用的交互体验。本篇文章将深入探讨该库的工作原理以及如何在项目中集成和自定义`android-pulltorefresh-...

    Android中ListView使用SimpleAdapter适配器实例

    Android中尝试气泡短信编程初探实例 ListView使用SimpleAdapter适配器详解 具体参考小魏博客:http://blog.csdn.net/xiaowei_cqu/article/details/7045497

    android-pro-listview.7z

    在Android应用开发中,ListView是经常被使用的一个组件,它用于展示大量的数据,通常以列表的形式呈现。本资料"android-pro-listview.7z"将带你深入理解ListView的工作原理,优化技巧以及相关扩展。 一、ListView...

    21.[开源][安卓][拖拽]drag-sort-listview-master

    21.[开源][安卓][拖拽]drag-sort-listview-master DragSortListView(DSLV)是Android ListView的一个扩展,支持拖拽排序和左右滑动删除功能。重写了TouchInterceptor(TI)类来提供更加优美的拖拽动画效果。 DSLV...

    3-10-2(列表之SimpleAdapter适配).zip

    本示例"3-10-2(列表之SimpleAdapter适配).zip"着重讲解如何使用SimpleAdapter来适配ListView,使得数据能够正确地显示在列表项中。在Android应用中,适配器(Adapter)扮演着桥梁的角色,它将数据模型与视图组件连接...

    3-10-2(列表之SimpleAdapter适配).7z

    在这个主题“3-10-2(列表之SimpleAdapter适配)”中,我们将深入探讨如何使用SimpleAdapter来构建动态列表。 SimpleAdapter的设计目的是简化数据绑定过程,特别是对于那些数据源是基本数据类型或简单对象的情况。它...

    19Android-16-listviewBaseAdapter.mp4

    19Android-16-listviewBaseAdapter.mp4

    19Android-15-listviewArray.mp4

    19Android-15-listviewArray.mp4

    5-ListView-SimpleAdapter及自定义Adapter-进阶2.rar

    本教程将深入探讨如何使用SimpleAdapter和自定义Adapter与ListView协同工作,以实现数据的动态展示。以下是对相关知识点的详细说明: 1. **ListView**: ListView是Android中的一个视图容器,可以显示一系列可滚动的...

    Android之simpleAdapter的ListView

    `SimpleAdapter`是Android SDK内置的适配器之一,主要用于将数据集(通常是`List, ?&gt;&gt;`)转换为ListView的列表项。它的主要优点在于无需自定义视图和复用视图的概念,因此对于初学者来说,理解和使用起来相对容易。 ...

Global site tag (gtag.js) - Google Analytics