首先看:
這個是多選模式的
首先看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>}
這樣就正確顯示了