今天學習不在布局檔案中寫布局而將布局檔案寫入到程式的Activity中去,在布局檔案中去布局,當我利用LayoutInflactor建立了CheckedTextView控制項以後,然後將CheckedTextView添加入ListView中,然後使用CheckedTextView使用setChecked將CheckedTextView設定成true或者設定成false的時候,發現無法改變CheckedTextView的選中的狀態,不能使用CheckedTextView自己帶的方法去修改自身的選中狀態。(CheckBox有同樣的問題)。
其中Activity中添加ListView的方法代碼如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
//設定顯示
listView = getListView();
//執行個體化
li = getLayoutInflater(); //設定可多選
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
listView.setAdapter(new DataAdapter());
}
其中設定listView結構的代碼是使用的listView.setAdapter()方法來設定的。(在這個裡面設定了CheckedTextVew),下面展示了DataAdapter中最重要的方法getView()方法:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View view = li.inflate(R.layout.second, null);
switch (position) {
//是否開啟通訊錄
case 0:
ctv1 = (CheckedTextView)li.inflate(
android.R.layout.simple_list_item_multiple_choice, null);
ctv1.setText(str[position]);
if(on_off == 1){
Log.i(TAG, "on_off="+on_off);
//ctv1.setChecked(true); listView.setItemChecked(position, true);
}else { //ctv1.setChecked(false);
listView.setItemChecked(position, false);
}
return ctv1;
//開啟鬧鐘
case 2:
ctv2 = (CheckedTextView)li.inflate(
android.R.layout.simple_list_item_multiple_choice, null);
ctv2.setText(str[position]);
if(alarm == 1) //ctv2.setChecked(true);
listView.setItemChecked(position, true);
else { //ctv2.setChecked(false);
listView.setItemChecked(position, false);
}
return ctv2;
default:
return null;
}
}
}
從上面的函數我們可以看到的是紅色注釋的部分是CheckedTextView控制項本身視圖去改變其自身的選中的狀態,這樣使用的話,在我們的ListView中CheckedTextView顯示將不會出現任何的改變,因此在ListView中CheckedTextView無法改變自身的狀態,而ListView中有一個方法listView.setItemChecked(long position, boolean value)方法來改變處於ListView某個位置的控制項的選中的狀態,若控制項不支援選中,將不會改變什麼,反之,控制項將改變其狀態。
看了看android其中的原始碼,看到了listView.setItemChecked()函數的方法,函數如下:
public void setItemChecked(int position, boolean value) {
if (mChoiceMode == CHOICE_MODE_NONE) {
return;
}
if (mChoiceMode == CHOICE_MODE_MULTIPLE) {
mCheckStates.put(position, value);
if (mCheckedIdStates != null && mAdapter.hasStableIds()) {
if (value) {
mCheckedIdStates.put(mAdapter.getItemId(position), Boolean.TRUE);
} else {
mCheckedIdStates.delete(mAdapter.getItemId(position));
}
}
}
}
我們可以看到方法中,當listView的ChoiceMod設定成了CHOICE_MODE_MULTIPLE後,是用mCheckedIdStates.put(mAdapter.getItemId(position), Boolean.TRUE);來設定控制項的值,因此我們可以推斷出listView某個的時候對其中的item進行了選中狀態的設定,因此,我們自己設定的話會被listView給覆蓋掉,只能使用listView方法去修改其狀態。
CheckBox 類似。
有什麼不對的請提出,謝謝了。