Android中ListView中使用CheckedTextView

转自:http://www.cnblogs.com/onlylittlegod/archive/2011/05/19/2050623.html


今天学习不在布局文件中写布局而将布局文件写入到程序的Activity中去,在布局文件中去布局,当我利用LayoutInflactor新建了CheckedTextView控件以后,然后将CheckedTextView添加入ListView中,然后使用CheckedTextView使用setChecked将CheckedTextView设置成true或者设置成false的时候,发现无法改变CheckedTextView的选中的状态,不能使用CheckedTextView自己带的方法去修改自身的选中状态。(CheckBox有同样的问题)。

其中Activity中添加ListView的方法代码如下:

复制代码
  @Override
protected void onCreate(BundlesavedInstanceState) {
// TODO Auto-generated methodstub
super.onCreate(savedInstanceState);


// 设置显示
listView =getListView();
// 实例化
li =getLayoutInflater();
     //设置可多选
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
listView.setAdapter( newDataAdapter());

}
复制代码

其中设置listView结构的代码是使用的listView.setAdapter()方法来设置的。(在这个里面设置了CheckedTextVew),下面展示了DataAdapter中最重要的方法getView()方法:

复制代码
@Override
public ViewgetView( int position,View convertView, ViewGroup parent) {
// TODO Auto-generated methodstub
Viewview = 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(longposition, booleanvalue)方法来改变处于ListView某个位置的控件的选中的状态,若控件不支持选中,将不会改变什么,反之,控件将改变其状态。

看了看android其中的源代码,看到了listView.setItemChecked()函数的方法,函数如下:

复制代码
public voidsetItemChecked( intposition, booleanvalue) {
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 类似。

有什么不对的请提出,谢谢了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值