Android 如何使用simpleAdapter
使用simpleAdapter的数据用一般都是HashMap构成的List,list的每一节对应ListView的每一行。HashMap的每个键值数据映射到布局文件中对应id的组件上。因为系统没有对应的布局文件可用,我们可以自己定义一个布局vlist.xml。下面做适配,new一个SimpleAdapter参数一次是:this,布局文件(vlist.xml),HashMap的 title 和 info,img。布局文件的组件id,title,info,img。布局文件的各组件分别映射到HashMap的各元素上,完成适配。
效果图:
有按钮的ListView
但是有时候,列表不光会用来做显示用,我们同样可以在在上面添加按钮。添加按钮首先要写一个有按钮的xml文件,然后自然会想到用上面的方法定义一个适配器,然后将数据映射到布局文件上。但是事实并非这样,因为按钮是无法映射的,即使你成功的用布局文件显示出了按钮也无法添加按钮的响应,这时就要研究一下ListView是如何现实的了,而且必须要重写一个类继承BaseAdapter。下面的示例将显示一个按钮和一个图片,两行字如果单击按钮将删除此按钮的所在行。并告诉你ListView究竟是如何工作的。效果如下:
效果图:
1 <?xml version="1.0" encoding="utf-8"?> 2 3 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 4 5 android:orientation="horizontal" 6 android:layout_width="fill_parent" 7 android:layout_height="fill_parent"> 8 <ImageView 9 android:id="@+id/img" 10 android:layout_width="wrap_content" 11 android:layout_height="wrap_content" 12 android:layout_margin="5px"/> 13 14 <LinearLayout 15 android:orientation="vertical" 16 android:layout_width="wrap_content" 17 android:layout_height="wrap_content"> 18 19 20 <TextView 21 android:id="@+id/title" 22 android:layout_width="wrap_content" 23 android:layout_height="wrap_content" 24 android:textColor="#FFFFFFFF" 25 android:textSize="22px" /> 26 27 <TextView 28 android:id="@+id/info" 29 android:layout_width="wrap_content" 30 android:layout_height="wrap_content" 31 android:textColor="#FFFFFFFF" 32 android:textSize="13px" /> 33 </LinearLayout> 34 35 <Button 36 android:id="@+id/view_btn" 37 android:layout_width="wrap_content" 38 android:layout_height="wrap_content" 39 android:text="@string/s_view_btn" 40 android:layout_gravity="bottom|right" /> 41 42 </LinearLayout>
1 /** 2 * @author allin 3 * 4 */ 5 6 public class MyListView4 extends ListActivity { 7 private List<Map<String, Object>> mData; 8 9 @Override 10 public void onCreate(Bundle savedInstanceState) { 11 super.onCreate(savedInstanceState); 12 mData = getData(); 13 MyAdapter adapter = new MyAdapter(this); 14 setListAdapter(adapter); 15 } 16 17 private List<Map<String, Object>> getData() { 18 List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); 19 Map<String, Object> map = new HashMap<String, Object>(); 20 map.put("title", "G1"); 21 map.put("info", "google 1"); 22 map.put("img", R.drawable.i1); 23 list.add(map); 24 map = new HashMap<String, Object>(); 25 map.put("title", "G2"); 26 map.put("info", "google 2"); 27 map.put("img", R.drawable.i2); 28 list.add(map); 29 map = new HashMap<String, Object>(); 30 map.put("title", "G3"); 31 map.put("info", "google 3"); 32 map.put("img", R.drawable.i3); 33 list.add(map); 34 return list; 35 } 36 37 // ListView 中某项被选中后的逻辑 38 @Override 39 protected void onListItemClick(ListView l, View v, int position, long id) { 40 Log.v("MyListView4-click", (String)mData.get(position).get("title")); 41 } 42 43 /** 44 * listview中点击按键弹出对话框 45 */ 46 47 public void showInfo(){ 48 new AlertDialog.Builder(this).setTitle("我的listview").setMessage("介绍...").setPositiveButton("确定", new DialogInterface.OnClickListener() { 49 50 @Override 51 public void onClick(DialogInterface dialog, int which) { 52 } 53 }).show(); 54 55 } 56 57 public final class ViewHolder{ 58 public ImageView img; 59 public TextView title; 60 public TextView info; 61 public Button viewBtn; 62 } 63 64 public class MyAdapter extends BaseAdapter{ 65 private LayoutInflater mInflater; 66 public MyAdapter(Context context){ 67 this.mInflater = LayoutInflater.from(context); 68 } 69 70 @Override 71 public int getCount() { 72 // TODO Auto-generated method stub 73 return mData.size(); 74 75 } 76 77 @Override 78 public Object getItem(int arg0) { 79 // TODO Auto-generated method stub 80 return null; 81 } 82 83 @Override 84 public long getItemId(int arg0) { 85 // TODO Auto-generated method stub 86 return 0; 87 } 88 @Override 89 public View getView(int position, View convertView, ViewGroup parent) { 90 ViewHolder holder = null; 91 if (convertView == null) { 92 holder=new ViewHolder(); 93 convertView = mInflater.inflate(R.layout.vlist2, null); 94 holder.img = (ImageView)convertView.findViewById(R.id.img); 95 holder.title = (TextView)convertView.findViewById(R.id.title); 96 holder.info = (TextView)convertView.findViewById(R.id.info); 97 holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn); 98 convertView.setTag(holder); 99 }else { 100 holder = (ViewHolder)convertView.getTag(); 101 } 102 holder.img.setBackgroundResource((Integer)mData.get(position).get("img")); 103 holder.title.setText((String)mData.get(position).get("title")); 104 holder.info.setText((String)mData.get(position).get("info")); 105 holder.viewBtn.setOnClickListener(new View.OnClickListener() { 106 107 @Override 108 public void onClick(View v) { 109 showInfo(); 110 } 111 }); 112 113 return convertView; 114 } 115 } 116 117 }