Android開發ListView中含有checkBox或者Button時會遇到的難題

來源:互聯網
上載者:User
   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;   }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.