ListView与TextView和Checkboxes表现得很糟糕

时间:2018-02-26 07:49:09

标签: java android

我有一个包含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>

重要的是整行是可点击的,而不仅仅是复选框。我真的不知道是什么原因引起的。

1 个答案:

答案 0 :(得分:1)

使用在列表的第1项上检查但在滚动时不取消选中其他项目的持有者。你应该像这样修改你的代码。

if(mOptionsList.get(position).isSelected()){
         holder.getCheckbox().setChecked(true);
 }
else
{
         holder.getCheckbox().setChecked(false);
}