在Android 開(kāi)發(fā)中歹袁,當(dāng)我們使用ListView時(shí)屹篓,比如item是一個(gè)RadioButton或者CheckBox等控件時(shí)技肩,此時(shí)會(huì)出現(xiàn)焦點(diǎn)問(wèn)題俗孝,比如我們選擇了一個(gè)RadioButton酒甸,當(dāng)我們滑動(dòng)ListView后,我們返回我們剛才選中的RadioButton時(shí)赋铝,會(huì)發(fā)現(xiàn)我們選擇的狀態(tài)沒(méi)有被選中插勤。這是怎么回事?下面來(lái)介紹一下怎么解決這個(gè)問(wèn)題革骨。
當(dāng)出現(xiàn)以上問(wèn)題時(shí)农尖,是因?yàn)長(zhǎng)istView和Item的焦點(diǎn)問(wèn)題沒(méi)有處理好而出現(xiàn)的
如何解決
以下介紹三種方法:
將ListView中的Item布局中的子控件focusable屬性設(shè)置為false
在getView方法中設(shè)置button.setFocusable(false)
設(shè)置item的根布局的屬性android:descendantFocusability="blocksDescendant"
android:descendantFocusability屬性共有三個(gè)取值,分別為:
- beforeDescendants:viewgroup會(huì)優(yōu)先其子類(lèi)控件而獲取到焦點(diǎn)
- afterDescendants:viewgroup 只有當(dāng)其子類(lèi)控件不需要獲取焦點(diǎn)時(shí)才獲取焦點(diǎn)
- blocksDescendants:viewgroup 會(huì)覆蓋子類(lèi)控件而直接獲得焦點(diǎn)
我們可以發(fā)現(xiàn)良哲,其實(shí)這三種方法都是為了讓Button等控件不能獲取焦點(diǎn)盛卡,從而使得item可以響應(yīng)點(diǎn)擊事件。
第三種方法使用起來(lái)相對(duì)方便筑凫,因?yàn)樗菍tem布局中的其他所有控件都設(shè)置為不能獲取焦點(diǎn)滑沧。下面我貼上我使用第三種方法的主要代碼喇颁。
- 布局文件如下(item的布局文件,以RadioButton解釋)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:descendantFocusability="blocksDescendants" >
<RadioButton
android:id="@+id/radio_bt"
android:layout_width="match_parent"
android:layout_height="78px"
android:clickable="false"
android:button="@null"
android:drawableRight="@drawable/remember_xml"
android:textColor="@android:color/white"
/>
</LinearLayout>
- 下面是在MainActivity中使用的主要代碼
@Override
public void showListDialog(final String[] str, final FLAG_CHOICE flag, int selected) {
final ListBaseAdapter adapter = new ListBaseAdapter(this, str);
//主要是在Adapter加入這個(gè)方法是為了讓ListView初始化或者響應(yīng)用戶的選中行為
adapter.setItemChoice(selected);
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// TODO Auto-generated method stub
//讓Listview更新選中Item狀態(tài)
adapter.setItemChoice(arg2);
}
});
mListView.setAdapter(adapter);
}
- 下面是Adapter主要代碼
@Override
public View getView(int arg0, View view, ViewGroup arg2) {
// TODO Auto-generated method stub
ViewHolder holder = null;
if (view == null) {
holder = new ViewHolder();
view = LayoutInflater.from(mContext).inflate(R.layout.layout_adapter, arg2, false);
holder.mRadioButton = (RadioButton) view.findViewById(R.id.radio_bt);
holder.mRadioButton.setPadding(20, 0, 20, 0);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
if (mIndex == arg0) {
holder.mRadioButton.setSelected(true);
} else {
holder.mRadioButton.setSelected(false);
}
holder.mRadioButton.setText(mData[arg0]);
return view;
}
public void setItemChoice(int index) {
mIndex = index;
notifyDataSetChanged();
}
以上是我在項(xiàng)目中使用的主要代碼嚎货,親測(cè)有效橘霎,到此結(jié)束,關(guān)于其他兩種解決方案殖属,還請(qǐng)各自驗(yàn)證姐叁。