SimpleAdapter使用详解(一)

前言:这篇文章仅对SimpleAdapter的使用方法进行详解,另外还有其它的两种用法,因为使用范围比较局限,我也用不到,所以就不讲了,这里也主要是为了做个学习笔记。写的不好,还望见谅。

一、简单实现

先看效果:

1、XML

要实现这个效果,首先我们要写一个XML文件,而这个布局文件仅仅定义了列表中一项的表现形式。

XML文件代码如下:(vlist.xml)

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns: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="#FFFFFF00"android:textSize="22px" /><TextView android:id="@+id/info"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#FF00FFFF"android:textSize="13px" /></LinearLayout></LinearLayout>2、JAVA代码1、将当前Activity改为派生自ListActivity

2、Java代码如下:

public class MainActivity extends ListActivity {@Overrideprotected 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的各元素上,完成适配。

注意:

1、没有MainActivity的XML布局文件,只有一个布局文件:list每一项的显示样式(vlist.xml)2、没有setContentView(R.layout.activity_main);因为在使用SetListAdapter()以后,就会当前当的样式在列表中显示出来。

二、派生自BaseAdapter

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

1、XML代码

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns: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="#FFFFFF00"android:textSize="22px" /><TextView android:id="@+id/info"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#FF00FFFF"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>

2、JAVA代码/** * @author harvic */import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.os.Bundle;import android.app.AlertDialog;import android.app.ListActivity;import android.content.Context;import android.content.DialogInterface;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.ImageView;import android.widget.TextView;public class MainActivity extends ListActivity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);MyAdapter adapter = new MyAdapter(this,getData());//获取将要绑定的数据传入其中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中点击按键弹出对话框 */public void showInfo(){new AlertDialog.Builder(this).setTitle("我的listview").setMessage("介绍…").setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}}).show();}//ViewHolder静态类public final class ViewHolder{public ImageView img;public TextView title;public TextView info;public Button viewBtn;}public class MyAdapter extends BaseAdapter{private LayoutInflater mInflater;private List<Map<String, Object>> mData;public MyAdapter(Context context,List<Map<String, Object>> mData){//根据context上下文加载布局this.mInflater = LayoutInflater.from(context);//将传入的数据保存在mData中this.mData=mData;}@Overridepublic int getCount() {//How many items are in the data set represented by this Adapter.//在此适配器中所代表的数据集中的条目数return mData.size();}@Overridepublic Object getItem(int position) {// Get the data item associated with the specified position in the data set.//获取数据集中与指定索引对应的数据项return position;}@Overridepublic long getItemId(int position) {//Get the row id associated with the specified position in the list.//获取在列表中与指定索引对应的行idreturn position;}@Override//Get a View that displays the data at the specified position in the data set.//获取一个在数据集中指定索引的视图来显示数据public View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;//如果缓存convertView为空,则需要创建Viewif (convertView == null) {//自定义的一个类用来缓存convertviewholder=new ViewHolder();//根据自定义的Item布局加载布局convertView = mInflater.inflate(R.layout.vlist, 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);//将设置好的布局保存到缓存中,并将其设置在Tag里,以便后面方便取出TagconvertView.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"));//为BTN设置点击监听事件holder.viewBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {showInfo();}});return convertView;}}}讲解:可你仍然感谢天地和人世所带来的这些变化和发生。

SimpleAdapter使用详解(一)

相关文章:

你感兴趣的文章:

标签云: