Android中ListView中使用CheckedTextView和CheckBox的理解

來源:互聯網
上載者:User

      今天學習不在布局檔案中寫布局而將布局檔案寫入到程式的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 類似。

      有什麼不對的請提出,謝謝了。 

相關文章

聯繫我們

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