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

  1. 今天学习不在布局文件中写布局而将布局文件写入到程序的Activity中去,在布局文件中去布局,当我利用LayoutInflactor新建了 CheckedTextView控件以后,然后将CheckedTextView添加入ListView中,然后使用CheckedTextView使用 setChecked将CheckedTextView设置成true或者设置成false的时候,发现无法改变CheckedTextView的选中的 状态,不能使用CheckedTextView自己带的方法去修改自身的选中状态。(CheckBox有同样的问题)。
  2.       其中Activity中添加ListView的方法代码如下:
  3. @Override
  4.     protected void onCreate(Bundle savedInstanceState) {
  5.         // TODO Auto-generated method stub
  6.         super.onCreate(savedInstanceState);
  7.     
  8.         //设置显示
  9.         listView = getListView();
  10.         //实例化
  11.         li = getLayoutInflater();     //设置可多选
  12.         listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
  13.         listView.setAdapter(new DataAdapter());
  14.         
  15.     }
  16. 其中设置listView结构的代码是使用的listView.setAdapter()方法来设置的。(在这个里面设置了CheckedTextVew),下面展示了DataAdapter中最重要的方法getView()方法:
  17. @Override
  18.         public View getView(int position, View convertView, ViewGroup parent) {
  19.             // TODO Auto-generated method stub
  20.             View view = li.inflate(R.layout.second, null);
  21.             switch (position) {
  22.             //是否开启通讯录
  23.             case 0:
  24.                 ctv1 = (CheckedTextView)li.inflate(
  25.                             android.R.layout.simple_list_item_multiple_choice, null);
  26.                 
  27.                 ctv1.setText(str[position]);
  28.                 
  29.                 if(on_off == 1){
  30.                     Log.i(TAG, "on_off="+on_off);
  31.                     //ctv1.setChecked(true);            listView.setItemChecked(position, true);
  32.                 }else {                    //ctv1.setChecked(false);
  33.                     listView.setItemChecked(position, false);
  34.                 }
  35.                 
  36.                 return ctv1;
  37.                         //开启闹钟
  38.             case 2:
  39.                 ctv2 = (CheckedTextView)li.inflate(
  40.                     android.R.layout.simple_list_item_multiple_choice, null);
  41.                 ctv2.setText(str[position]);
  42.                 
  43.                 
  44.                 if(alarm == 1)             //ctv2.setChecked(true);
  45.                     listView.setItemChecked(position, true);
  46.                 else {             //ctv2.setChecked(false);
  47.                     listView.setItemChecked(position, false);
  48.                 }
  49.                 return ctv2;
  50.             default:
  51.                 return null;
  52.             }
  53.         }
  54.         
  55.     }
  56. 从上面的函数我们可以看到的是红色注释的部分是CheckedTextView控件本身视图去改变其自身的选中的状态,这样使用的话,在我们的 ListView中CheckedTextView显示将不会出现任何的改变,因此在ListView中CheckedTextView无法改变自身的状 态,而ListView中有一个方法listView.setItemChecked(long position, boolean value)方法来改变处于ListView某个位置的控件的选中的状态,若控件不支持选中,将不会改变什么,反之,控件将改变其状态。
  57.        看了看android其中的源代码,看到了listView.setItemChecked()函数的方法,函数如下:
  58. public void setItemChecked(int position, boolean value) {
  59.         if (mChoiceMode == CHOICE_MODE_NONE) {
  60.             return;
  61.         }
  62.         if (mChoiceMode == CHOICE_MODE_MULTIPLE) {
  63.             mCheckStates.put(position, value);
  64.             if (mCheckedIdStates != null && mAdapter.hasStableIds()) {
  65.                 if (value) {
  66.                     mCheckedIdStates.put(mAdapter.getItemId(position), Boolean.TRUE);
  67.                 } else {
  68.                     mCheckedIdStates.delete(mAdapter.getItemId(position));
  69.                 }
  70.             }
  71.         }
  72. }
  73. 我们可以看到方法中,当listView的ChoiceMod设置成了CHOICE_MODE_MULTIPLE后,是用 mCheckedIdStates.put(mAdapter.getItemId(position), Boolean.TRUE);来设置控件的值,因此我们可以推断出listView某个的时候对其中的item进行了选中状态的设置,因此,我们自己设置 的话会被listView给覆盖掉,只能使用listView方法去修改其状态。
  74.      CheckBox 类似。
posted @ 2013-08-12 11:39  brave-sailor  阅读(368)  评论(0编辑  收藏  举报