如果ListView的Item带有一个单选或复选控件, 需要实现单选或复选的功能, 该怎么做?
在ListView中Item的更新是通过Adapter实现的, Adapter关联了Model和View, 会同步Model和View的变化.
因此, 容易想到的是通过更改Model在同步Item的更改, 当然这样做是可以实现的.
然而实现起来十分麻烦, 需要在Model中添加标记位, 在Adapter中添加判断逻辑.........
下面介绍一种比较简单的实现方式:
ListView有一个属性android:choiceMode可以设置单选还是多选, 其实ListView中是通过Checkable接口实现单选还是多选的, 下面是ListView中的一段源码:
if (mChoiceMode != CHOICE_MODE_NONE && mCheckStates != null) { if (child instanceof Checkable) { ((Checkable) child).setChecked(mCheckStates.get(position)); } else if (getContext().getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.HONEYCOMB) { child.setActivated(mCheckStates.get(position)); } }
系统设置中的某些偏好设置中使用了一个叫做CheckedTextView的控件, 这个对象也是实现了Checkable接口的. CheckedTextView的定义如下:
public class CheckedTextView extends TextView implements Checkable {
因此很多系统偏好设置中的ListPreference的选项便是使用CheckedTextView控件
如果要自定义一个可选的ListView的Item那么我我们实现Checkable接口就行了.
下面是案例源码:
public class SelectableItemView extends LinearLayout implements Checkable { //必须实现Checkable接口 private CheckBox mCkbx; public SelectableItemView(Context context) { super(context); init(context); }