我有一个包含TextView和Checkbox的ListView的Fragment。 ListView的每一行都必须是可点击的,单击时,复选框将被选中。但是,当用户选择第一行并选中其复选框然后滚动时,最后一行的复选框和其他一些复选框也会被检查,这是不需要的。这就是我的自定义适配器中的getView()
方法的样子:
OptionsListAdapter.java
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final OptionRowViewHolder holder;
View row = convertView;
if (row == null) {
holder = new OptionRowViewHolder();
row = LayoutInflater.from(getContext()).inflate(mLayoutId, parent, false);
holder.setCheckbox((CheckBox) row.findViewById(R.id.checkbox));
holder.setText((TextView) row.findViewById(R.id.text));
row.setTag(holder);
} else {
holder = (OptionRowViewHolder) row.getTag();
}
holder.getText().setText(mOptionsList.get(position).getTitle());
holder.getCheckbox().setTag(position);
holder.getCheckbox().setClickable(false);
if(mOptionsList.get(position).isSelected()){
if((int)holder.getCheckbox().getTag() == position){
holder.getCheckbox().setChecked(true);
}
}
row.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LinearLayout layout = (LinearLayout) v;
CheckBox c = (CheckBox) layout.getChildAt(2);
int pos = (Integer) c.getTag();
Option option = getItem(position);
if(c.isChecked()){
c.setChecked(false);
option.setSelected(false);
mOptionsList.set(pos, option);
}else{
c.setChecked(true);
option.setSelected(true);
mOptionsList.set(pos, option);
}
}
});
return row;
}
这是每行的XML布局:
options_list_layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content" android:layout_width="match_parent"
android:id="@+id/option_row"
android:paddingBottom="10dp"
android:paddingTop="10dp"
android:paddingLeft="30dp"
android:paddingStart="30dp"
android:paddingRight="30dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="text"
android:textSize="@dimen/tv_text_size"
android:textColor="#000000"
android:id="@+id/text" />
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1" />
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleX="1.5"
android:scaleY="1.5"
android:id="@+id/checkbox"/>
</LinearLayout>
重要的是整行是可点击的,而不仅仅是复选框。我真的不知道是什么原因引起的。
答案 0 :(得分:1)
使用在列表的第1项上检查但在滚动时不取消选中其他项目的持有者。你应该像这样修改你的代码。
if(mOptionsList.get(position).isSelected()){
holder.getCheckbox().setChecked(true);
}
else
{
holder.getCheckbox().setChecked(false);
}