歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android:實現帶圖片和CheckBox的ListView

Android:實現帶圖片和CheckBox的ListView

日期:2017/3/1 10:14:22   编辑:Linux編程

實現在ListView的每一條List中帶圖片和CheckBox。

(1)第一步,先上布局文件:main.xml和list.xml

main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical" >
  6. <TextView
  7. android:layout_width="fill_parent"
  8. android:layout_height="wrap_content"
  9. android:text="@string/hello" />
  10. <ListView
  11. android:id="@+id/lv"
  12. android:layout_width="fill_parent"
  13. android:layout_height="wrap_content"/>
  14. </LinearLayout>

list.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="horizontal" >
  6. <ImageView
  7. android:id="@+id/img"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:layout_gravity="center_vertical"/>
  11. <TextView
  12. android:id="@+id/title"
  13. android:textSize="18dip"
  14. android:layout_weight="1"
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content"/>
  17. <CheckBox
  18. android:id="@+id/cb"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:focusable="false"
  22. android:focusableInTouchMode="false"
  23. android:clickable="false"
  24. android:checkMark="?android:attr/listChoiceIndicatorMultiple"/>
  25. </LinearLayout>

<1>TextView中android:layout_weight="1"
這一句可以使中間的textview權重增大,從而後面的checkbok可以居右顯示。

<2>下面三句很重要,如果不加就會出現錯誤。

由於checkbox的點擊事件優先級比listview的高,所以要在checkbox中添加android:focusable="false",使得checkbox初始的時候沒有獲取焦點。

  1. android:focusable="false"
  2. android:focusableInTouchMode="false"
  3. android:clickable="false"

(2)為給ListView匹配數據,新建一個MyAdapter類,繼承自BaseAdapter。在MyAdapter中實現對數據的綁定,在這個測試中,我把數據寫死了。

注意getView方法中對數據的處理。

MyAdapter.java

  1. package com.tgb.ys.test;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import android.content.Context;
  7. import android.view.LayoutInflater;
  8. import android.view.View;
  9. import android.view.ViewGroup;
  10. import android.widget.BaseAdapter;
  11. import android.widget.CheckBox;
  12. import android.widget.ImageView;
  13. import android.widget.TextView;
  14. public class MyAdapter extends BaseAdapter {
  15. private LayoutInflater mInflater;
  16. private List<Map<String, Object>> mData;
  17. public static Map<Integer, Boolean> isSelected;
  18. public MyAdapter(Context context) {
  19. mInflater = LayoutInflater.from(context);
  20. init();
  21. }
  22. //初始化
  23. private void init() {
  24. mData = new ArrayList<Map<String,Object>>();
  25. for (int i=0; i<5; i++) {
  26. Map<String, Object> map = new HashMap<String, Object>();
  27. map.put("img", R.drawable.leaf);
  28. map.put("title", "第" + (i+1) + "行的標題");
  29. mData.add(map);
  30. }
  31. //定義isSelected這個map是記錄每個listItem的狀態,初始狀態全部為false
  32. isSelected = new HashMap<Integer, Boolean>();
  33. for (int i=0; i<mData.size(); i++) {
  34. isSelected.put(i, false);
  35. }
  36. }
  37. public int getCount() {
  38. // TODO Auto-generated method stub
  39. return mData.size();
  40. }
  41. public Object getItem(int position) {
  42. // TODO Auto-generated method stub
  43. return null;
  44. }
  45. public long getItemId(int position) {
  46. // TODO Auto-generated method stub
  47. return 0;
  48. }
  49. public View getView(int position, View convertView, ViewGroup parent) {
  50. ViewHolder holder = null;
  51. //convertView為null的時候初始化convertView
  52. if (convertView == null) {
  53. holder = new ViewHolder();
  54. convertView = mInflater.inflate(R.layout.vlist, null);
  55. holder.img = (ImageView)convertView.findViewById(R.id.img);
  56. holder.title = (TextView)convertView.findViewById(R.id.title);
  57. holder.cBox = (CheckBox)convertView.findViewById(R.id.cb);
  58. convertView.setTag(holder);
  59. } else {
  60. holder = (ViewHolder)convertView.getTag();
  61. }
  62. holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));
  63. holder.title.setText(mData.get(position).get("title").toString());
  64. holder.cBox.setChecked(isSelected.get(position));
  65. return convertView;
  66. }
  67. public final class ViewHolder {
  68. public ImageView img;
  69. public TextView title;
  70. public CheckBox cBox;
  71. }
  72. }

(3)在Activity中調用:

TestCheckBoxActivity.java

  1. package com.tgb.ys.test;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.widget.AdapterView;
  6. import android.widget.AdapterView.OnItemClickListener;
  7. import android.widget.ListView;
  8. import com.tgb.ys.test.MyAdapter.ViewHolder;
  9. /**
  10. * 總結:
  11. * 1、數據可以在Activity中獲取,在初始化Adapter的時候當做參數傳遞過去,這樣就可以是list編程動態的。
  12. * 2、對MyAdapter中getview的理解不夠,尤其是convertView.setTag(holder),
  13. * @author Administrator
  14. */
  15. public class TestCheckBoxActivity extends Activity {
  16. /** Called when the activity is first created. */
  17. @Override
  18. public void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.main);
  21. ListView list = (ListView)findViewById(R.id.lv);
  22. MyAdapter adapter = new MyAdapter(this);
  23. list.setAdapter(adapter);
  24. list.setItemsCanFocus(false);
  25. list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
  26. list.setOnItemClickListener(new OnItemClickListener() {
  27. public void onItemClick(AdapterView<?> parent, View view, int position,
  28. long id) {
  29. // TODO Auto-generated method stub
  30. ViewHolder vHolder = (ViewHolder)view.getTag();
  31. //在每次獲取點擊的item時將對應的checkBox狀態改變,同時修改map的值
  32. vHolder.cBox.toggle();
  33. MyAdapter.isSelected.put(position, vHolder.cBox.isChecked());
  34. }
  35. });
  36. }
  37. }

(4)上結果圖:

Copyright © Linux教程網 All Rights Reserved