android開發經常會遇到ListView中含有checkBox和Button的情況,這裡主要會有三個問題,下面分別論述: 1. ListView中含有checkBox或者Button時,listView的item無法響應點擊事件,這主要是因為checkBox和Button等擷取焦點的能力高於listView,此時應該讓其子控制項不能擷取焦點,即在布局檔案中設定子控制項屬性android:focusable="false"或者在listView的adapter的布局中加入android:descendantFocusability="blocksDescendants"屬性,descendantFocusability表示子控制項均失去焦點。 2. ListView中含有checkBox時,選中CheckBox時,滑動listView會發現有多個選中的checkBox,即發生了錯位,這個主要是與adapter的getView方法的機制有關係,即listView的每個介面都顯示固定的item數,當滑動時,只是將前一屏的item重新繪製了一遍,這個可以先去瞭解下自訂adpter的getView的重新整理機制。對於這個問題的解決辦法是記錄下選中的checkBox的位置(這個方法是當點擊ListView的item時選中checkBox的前提),在getView中根據選中位置進行設定checkBox的狀態。具體代碼見下面: private List<String> selectPosition = newArrayList<String>();
privateclass ListItems {
CheckBox itemChechBox;
TextView itemName; } @Override public View getView(int
position, ViewconvertView, ViewGroup parent) { ListItemsitems =
null; if (convertView ==
null) { items =
new ListItems(); convertView=
mInflater.inflate(R.layout.
upload_from_file_browser_item,
null); items.itemChechBox =(CheckBox) convertView.findViewById(R.id.
cb_choose_file); items.itemName = (TextView)convertView.findViewById(R.id.
tv_upload_item); convertView.setTag(items); }
else { items =(ListItems) convertView.getTag(); } mListView.setOnItemClickListener(newOnItemClickListener()
{ @Override publicvoidonItemClick(AdapterView<?> arg0, View
view, int position,
long id) { ListItemsitem = (ListItems) view.getTag(); if (selectPosition.contains(""
+position)) {
item.itemChechBox.setChecked(false);
selectPosition.remove("" +position); }else { selectPosition.add(""
+position);
item.itemChechBox.setChecked(true); //記錄選中的item的位置
}}); if (selectPosition.contains(""
+position)) { // 顯示選中的checkBox items.itemChechBox.setChecked(true); }
else { items.itemChechBox.setChecked(false); } } return convertView; } 3. ListView中含有Button時,我們有時需要知道點擊button位於listView的哪個position下,即要擷取item的資料,由於button的click事件是非同步,無法得到點擊的位置,這個原因與上面的checkBox類似,這時有一個辦法是給button設定Tag,點擊時擷取tag來判斷位置,實現代碼如下: @Override public View getView(int
position, ViewconvertView, ViewGroup parent) { ListHolderholder; if (convertView ==
null) { holder =new ListHolder(); convertView=
mInflater.inflate(R.layout.homework_list_item,
null); holder.homeworkUpload = (Button)convertView.findViewById(R.id.homework_list_btn_uploadhomework); convertView.setTag(holder); }else { holder =(ListHolder) convertView.getTag(); } holder.homeworkUpload.setTag(position); holder.homeworkUpload.setOnClickListener(new
OnClickListener(){ @Override
publicvoid onClick(View v) { /** *
上傳家庭作業功能暫時屏蔽 */ Log.i("hubei",
"click position:"+v.getTag());Object homework =
list.get(Integer.parseInt(""+v.getTag())); } }); } return convertView; }