Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android進階:ListView深入學習 choiceMode使用及自定義Adapter

Android進階:ListView深入學習 choiceMode使用及自定義Adapter

編輯:Android開發實例

首先看效果圖:

 

                                   

 

這個是多選模式的

 

 

首先看Layout配置文件

 

 

  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
  3.     android:orientation="vertical"    
  4.     android:layout_width="fill_parent"    
  5.     android:layout_height="fill_parent"    
  6.     >    
  7.     <Button 
  8.         android:id="@+id/addButton" 
  9.         android:layout_width="fill_parent" 
  10.         android:layout_height="wrap_content"   
  11.         android:text="增加一個" 
  12.         /> 
  13.     <!-- android:scrollbarFadeDuration 一直顯示滾動條   android:fastScrollEnabled  顯示拖動塊--> 
  14. <ListView   
  15.         android:id="@id/android:list"   
  16.         android:layout_width="fill_parent" 
  17.         android:divider="#ee31ff5e" 
  18.         android:dividerHeight="1dp" 
  19.         android:choiceMode="multipleChoice" 
  20.         android:layout_height="fill_parent" 
  21.         android:fastScrollEnabled="true" 
  22.         android:focusable="true"   
  23.         android:scrollbarFadeDuration="0"/> 
  24. </LinearLayout> 

 

其中的android:choiceMode="multipleChoice"選項就是設置選擇模式的,

 

他包括幾個選擇 CHOICE_MODE_MULTIPLE(多選), CHOICE_MODE_NONE(默認), CHOICE_MODE_SINGLE(單選)

 

這裡還設置了divider

 

下面看代碼

 

 

  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3. import java.util.Random;  
  4. import android.app.ListActivity;  
  5. import android.content.Context;  
  6. import android.database.Cursor;  
  7. import android.os.Bundle;  
  8. import android.view.Gravity;  
  9. import android.view.LayoutInflater;  
  10. import android.view.MotionEvent;  
  11. import android.view.View;  
  12. import android.view.ViewGroup;  
  13. import android.view.View.OnTouchListener;  
  14. import android.widget.AdapterView;  
  15. import android.widget.ArrayAdapter;  
  16. import android.widget.BaseAdapter;  
  17. import android.widget.Button;  
  18. import android.widget.ListView;  
  19. import android.widget.TextView;  
  20. import android.widget.Toast;  
  21. import android.widget.AdapterView.OnItemClickListener;  
  22. public class ListViewDemo2 extends ListActivity{  
  23.     private Cursor cursor;  
  24.       
  25.     private Button button;  
  26.       
  27.     private TextView textViewFooter;  
  28.       
  29.     private TextView textViewHeader;  
  30.       
  31.     private ArrayAdapter<String> adapter ;  
  32.       
  33.     private int counter = 10;  
  34.       
  35.     private List<String> list = new ArrayList<String>();  
  36.       
  37.     @Override 
  38.     protected void onCreate(Bundle savedInstanceState) {  
  39.           
  40.         list.add("aa");  
  41.         list.add("bb");  
  42.         list.add("cc");  
  43.         list.add("dd");  
  44.         list.add("ee");  
  45.         list.add("ff");  
  46.         list.add("gg");  
  47.         list.add("hh");  
  48.         list.add("ii");  
  49.         list.add("jj");  
  50.         list.add("kk");  
  51.         list.add("ll");  
  52.         list.add("mm");  
  53.         list.add("nn");  
  54.           
  55.         super.onCreate(savedInstanceState);  
  56.         setContentView(R.layout.listviewdemo2);  
  57.         final ListView listView= (ListView) findViewById(android.R.id.list);  
  58.         textViewHeader = new TextView(this);  
  59.         textViewHeader.setGravity(Gravity.CENTER);  
  60.         textViewHeader.setTextSize(17);  
  61.         textViewFooter = new TextView(this);  
  62.         textViewFooter.setGravity(Gravity.CENTER);  
  63.         textViewFooter.setText("點擊查看更多");  
  64.         textViewFooter.setTextSize(18);  
  65.         textViewHeader.setText("全部信息("+list.size()+")");  
  66.         listView.addHeaderView(textViewHeader);  
  67.         listView.addFooterView(textViewFooter);  
  68.           
  69.         adapter = new ArrayAdapter<String>(ListViewDemo2.this,android.R.layout.simple_list_item_multiple_choice,list);  
  70.         listView.setOnItemClickListener(new OnItemClickListener(){  
  71.             @Override 
  72.             public void onItemClick(AdapterView<?> parent, View view,  
  73.                     int position, long id) {  
  74.                 String strtemp = "";  
  75.                 for(long ids :listView.getCheckItemIds()){  
  76.                     strtemp += ids+":";  
  77.                 }  
  78.                 Toast.makeText(ListViewDemo2.this, ""+strtemp, Toast.LENGTH_LONG).show();  
  79.                   
  80.             }});  
  81.           
  82.         setListAdapter(adapter);  
  83.           
  84.         listView.setOnTouchListener(new OnTouchListener(){  
  85.             @Override 
  86.             public boolean onTouch(View v, MotionEvent event) {  
  87.                 switch (event.getAction()) {  
  88.                 case MotionEvent.ACTION_DOWN:  
  89.                     //獲得當前點擊位置的item序號  
  90.                     int itemnum = listView.pointToPosition((int)event.getX(), (int)event.getY());   
  91.                     //獲得當前點擊位置的RowId,為-1的除外  
  92.                     long temp = listView.pointToRowId((int)event.getX(), (int)event.getY());  
  93.                     Toast.makeText(ListViewDemo2.this, ""+itemnum+":"+temp, Toast.LENGTH_LONG).show();  
  94.                     break;  
  95.                 default:  
  96.                     break;  
  97.                 }  
  98.                 return false;  
  99.             }});  
  100.           
  101.         button = (Button) findViewById(R.id.addButton);  
  102.         button.setOnClickListener(new View.OnClickListener(){  
  103.             @Override 
  104.             public void onClick(View v) {  
  105.                 Random random = new Random();  
  106.                 int position = random.nextInt(list.size());  
  107.                 list.add(position, ""+counter++);  
  108.                 adapter.notifyDataSetInvalidated();  
  109.                 textViewHeader.setText("全部信息("+list.size()+")");  
  110.             }  
  111.               
  112.         });  
  113.           
  114.     }  
  115.       

 

通過android已定義的ArrayAdapter來顯示數據,效果如圖,

 

裡面添加了三個事件:

 

1、OnTouchListener  這裡通過觸摸點來定位這個list的position信息,包括兩個方法 pointToPosition和pointToRowId,注意這兩個方法的不同點,就是在狀態為-1的數據是否計算的區別

 

2、OnItemClickListener 這裡獲得當前選擇的條目 通過方法getCheckItemIds來獲得

 

3、Button的點擊,這裡動態增加一條數據項,可以發現通過 getCheckItemIds來標記的選擇項是通過位置來記錄的,跟選擇選項的內容無關,所以這裡如果數據是動態的就要 需要注意

 

還有一個問題,剛開始我

new ArrayAdapter<String>(ListViewDemo2.this,android.R.layout.simple_list_item_multiple_choice,list);

 

這裡構造方法傳入的是一個數組, 這樣就發現了一個問題:

在我點擊button當然是數組數據增加一條,但是發現list中的數據沒有變化,

這個是為什麼呢,難道是傳入的集合跟 ArrayAdapter中的集合不是同一個引用,那又發現了 ArrayAdapter中有add和insert方法,但用了之後發現有 java.lang.UnsupportedOperationException這個異常,android居然還沒實現,真是奇怪啊,

 

後來詳細看了下 ArrayAdapter這個類的構造方法,原來傳入list跟數據操作不同,如果是list直接用該引用,如果傳入數組,就會通過Arrays.asList()來創造一個新List 這個區別就太大了, 後來只能把數組改成List 真是郁悶啊

 

 

這裡使用的是 ArrayAdapter ,那很多時候我們需要自定義Adater的,可能會處於數據處理,效率優化的考慮,

 

如果自定義Adapter如下

 

 

  1. class MyAdapter extends BaseAdapter{  
  2.         @Override 
  3.         public int getCount() {  
  4.             return list.size() ;  
  5.         }  
  6.         @Override 
  7.         public Object getItem(int position) {  
  8.             return list.get(position);  
  9.         }  
  10.         @Override 
  11.         public long getItemId(int position) {  
  12.             return position;  
  13.         }  
  14.         @Override 
  15.         public View getView(int position, View convertView, ViewGroup parent) {  
  16.             TextView tv = new TextView(ListViewDemo2.this);  
  17.             tv.setText(list.get(position));  
  18.             tv.setHeight(30);  
  19.             tv.setGravity(Gravity.CENTER);  
  20.             return tv;  
  21.         }  
  22.           
  23.     } 

 

這樣定義顯示的時候就會發現多選按鈕框不見了,看 ArrayAdapter的實現就會發現,他所用的 android.R.layout.simple_list_item_multiple_choice布局用的是CheckedTextView組件

 

 

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <CheckedTextView android:textAppearance="?textAppearanceLarge" android:gravity="center_vertical" android:id="@id/text1" android:paddingLeft="6.0dip" android:paddingRight="6.0dip" android:layout_width="fill_parent" android:layout_height="?listPreferredItemHeight" android:checkMark="?listChoiceIndicatorMultiple" 
  3.   xmlns:android="http://schemas.android.com/apk/res/android" /> 

 

所以這裡如果用TextVew就不會顯示選擇提示框,其實這個組件就是TextView的子類

 

這裡我們要用這個組件

 

 

  1. class MyAdapter extends BaseAdapter{  
  2.         @Override 
  3.         public int getCount() {  
  4.             return list.size() ;  
  5.         }  
  6.         @Override 
  7.         public Object getItem(int position) {  
  8.             return list.get(position);  
  9.         }  
  10.         @Override 
  11.         public long getItemId(int position) {  
  12.             return position;  
  13.         }  
  14.         @Override 
  15.         public View getView(int position, View convertView, ViewGroup parent) {  
  16.             LayoutInflater inflater = (LayoutInflater)getApplication().getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  17.             View view = inflater.inflate(android.R.layout.simple_list_item_multiple_choice, parent, false);  
  18.             TextView tv = (TextView)view;  
  19.             tv.setText(list.get(position));  
  20.             tv.setHeight(30);  
  21.             tv.setGravity(Gravity.CENTER);  
  22.             return tv;  
  23.         }  
  24.           
  25.     } 

 

這樣就正確顯示了

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved