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

來源:互聯網
上載者:User

首先看:

 

      

            

               

 

這個是多選模式的

 

 

首先看Layout設定檔

 

<?xml version="1.0" encoding="utf-8"?><br /><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"<br /> android:orientation="vertical"<br /> android:layout_width="fill_parent"<br /> android:layout_height="fill_parent"<br /> ><br /> <Button<br /> android:id="@+id/addButton"<br /> android:layout_width="fill_parent"<br /> android:layout_height="wrap_content"<br /> android:text="增加一個"<br /> /><br /> <!-- android:scrollbarFadeDuration 一直顯示捲軸 android:fastScrollEnabled 顯示拖動塊--><br /><ListView<br />android:id="@id/android:list"<br />android:layout_width="fill_parent"<br />android:divider="#ee31ff5e"<br />android:dividerHeight="1dp"<br />android:choiceMode="multipleChoice"<br />android:layout_height="fill_parent"<br />android:fastScrollEnabled="true"<br />android:focusable="true"<br />android:scrollbarFadeDuration="0"/><br /></LinearLayout>

 

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

 

他包括幾個選擇

CHOICE_MODE_MULTIPLE(多選),

CHOICE_MODE_NONE(預設),

CHOICE_MODE_SINGLE(單選)

 

這裡還設定了divider

 

下面看代碼

 

import java.util.ArrayList;<br />import java.util.List;<br />import java.util.Random;<br />import android.app.ListActivity;<br />import android.content.Context;<br />import android.database.Cursor;<br />import android.os.Bundle;<br />import android.view.Gravity;<br />import android.view.LayoutInflater;<br />import android.view.MotionEvent;<br />import android.view.View;<br />import android.view.ViewGroup;<br />import android.view.View.OnTouchListener;<br />import android.widget.AdapterView;<br />import android.widget.ArrayAdapter;<br />import android.widget.BaseAdapter;<br />import android.widget.Button;<br />import android.widget.ListView;<br />import android.widget.TextView;<br />import android.widget.Toast;<br />import android.widget.AdapterView.OnItemClickListener;<br />public class ListViewDemo2 extends ListActivity{<br />private Cursor cursor;</p><p>private Button button;</p><p>private TextView textViewFooter;</p><p>private TextView textViewHeader;</p><p>private ArrayAdapter<String> adapter ;</p><p>private int counter = 10;</p><p>private List<String> list = new ArrayList<String>();</p><p>@Override<br />protected void onCreate(Bundle savedInstanceState) {</p><p>list.add("aa");<br />list.add("bb");<br />list.add("cc");<br />list.add("dd");<br />list.add("ee");<br />list.add("ff");<br />list.add("gg");<br />list.add("hh");<br />list.add("ii");<br />list.add("jj");<br />list.add("kk");<br />list.add("ll");<br />list.add("mm");<br />list.add("nn");</p><p>super.onCreate(savedInstanceState);<br />setContentView(R.layout.listviewdemo2);<br />final ListView listView= (ListView) findViewById(android.R.id.list);<br />textViewHeader = new TextView(this);<br />textViewHeader.setGravity(Gravity.CENTER);<br />textViewHeader.setTextSize(17);<br />textViewFooter = new TextView(this);<br />textViewFooter.setGravity(Gravity.CENTER);<br />textViewFooter.setText("點擊查看更多");<br />textViewFooter.setTextSize(18);<br />textViewHeader.setText("全部資訊("+list.size()+")");<br />listView.addHeaderView(textViewHeader);<br />listView.addFooterView(textViewFooter);</p><p>adapter = new ArrayAdapter<String>(ListViewDemo2.this,android.R.layout.simple_list_item_multiple_choice,list);<br />listView.setOnItemClickListener(new OnItemClickListener(){<br />@Override<br />public void onItemClick(AdapterView<?> parent, View view,<br />int position, long id) {<br />String strtemp = "";<br />for(long ids :listView.getCheckItemIds()){<br />strtemp += ids+":";<br />}<br />Toast.makeText(ListViewDemo2.this, ""+strtemp, Toast.LENGTH_LONG).show();</p><p>}});</p><p>setListAdapter(adapter);</p><p>listView.setOnTouchListener(new OnTouchListener(){<br />@Override<br />public boolean onTouch(View v, MotionEvent event) {<br />switch (event.getAction()) {<br />case MotionEvent.ACTION_DOWN:<br />//獲得當前點擊位置的item序號<br />int itemnum = listView.pointToPosition((int)event.getX(), (int)event.getY());<br />//獲得當前點擊位置的RowId,為-1的除外<br />long temp = listView.pointToRowId((int)event.getX(), (int)event.getY());<br />Toast.makeText(ListViewDemo2.this, ""+itemnum+":"+temp, Toast.LENGTH_LONG).show();<br />break;<br />default:<br />break;<br />}<br />return false;<br />}});</p><p>button = (Button) findViewById(R.id.addButton);<br />button.setOnClickListener(new View.OnClickListener(){<br />@Override<br />public void onClick(View v) {<br />Random random = new Random();<br />int position = random.nextInt(list.size());<br />list.add(position, ""+counter++);<br />adapter.notifyDataSetInvalidated();<br />textViewHeader.setText("全部資訊("+list.size()+")");<br />}</p><p>});</p><p>}</p><p>}

 

通過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如下

 

class MyAdapter extends BaseAdapter{<br />@Override<br />public int getCount() {<br />return list.size() ;<br />}<br />@Override<br />public Object getItem(int position) {<br />return list.get(position);<br />}<br />@Override<br />public long getItemId(int position) {<br />return position;<br />}<br />@Override<br />public View getView(int position, View convertView, ViewGroup parent) {<br />TextView tv = new TextView(ListViewDemo2.this);<br />tv.setText(list.get(position));<br />tv.setHeight(30);<br />tv.setGravity(Gravity.CENTER);<br />return tv;<br />}</p><p>}

 

這樣定義顯示的時候就會發現多選按鈕框不見了,看

ArrayAdapter的實現就會發現,他所用的

android.R.layout.simple_list_item_multiple_choice布局用的是CheckedTextView組件

 

<?xml version="1.0" encoding="UTF-8"?><br /><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"<br /> xmlns:android="http://schemas.android.com/apk/res/android" />

 

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

 

這裡我們要用這個組件

 

class MyAdapter extends BaseAdapter{<br />@Override<br />public int getCount() {<br />return list.size() ;<br />}<br />@Override<br />public Object getItem(int position) {<br />return list.get(position);<br />}<br />@Override<br />public long getItemId(int position) {<br />return position;<br />}<br />@Override<br />public View getView(int position, View convertView, ViewGroup parent) {<br />LayoutInflater inflater = (LayoutInflater)getApplication().getSystemService(Context.LAYOUT_INFLATER_SERVICE);<br />View view = inflater.inflate(android.R.layout.simple_list_item_multiple_choice, parent, false);<br />TextView tv = (TextView)view;<br />tv.setText(list.get(position));<br />tv.setHeight(30);<br />tv.setGravity(Gravity.CENTER);<br />return tv;<br />}</p><p>}

 

這樣就正確顯示了

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.