【问题标题】:Android checkbox + listview issueAndroid复选框+列表视图问题
【发布时间】:2016-04-26 06:42:55
【问题描述】:

我的列表视图的每个项目都包含一个复选框。

我希望每当我点击我的ListView 的一行时,CheckBox 就会被选中/取消选中。现在,CheckBox 和 ListView 项目是两个分开的东西,这意味着我可以单击 ListView 项目(复选框“后面”)或 CheckBox。

问题是如果我点击CheckBox,它不会触发itemClickListener(这是合乎逻辑的,因为它们是分开的)。

所以我想要的是项目和复选框“作为一个”工作。

以下是我的代码的相关部分:

活动:

listView.setAdapter(new FoodTypeAdapter(this, foodTypeList));
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            CheckBox cb = (CheckBox) view.findViewById(R.id.foodType);
            if (cb.isChecked()) {
                intent.putExtra("position", position);
            }
        }
    });

适配器:

private boolean[] checkBoxState;

public FoodTypeAdapter(Context context, List<FoodType> foodTypeList) {
    this.foodTypeList = foodTypeList;
    inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    checkBoxState = new boolean[foodTypeList.size()];
}

static class ViewHolder {
    protected CheckBox foodType;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View newView;
    if (convertView == null) {
        newView = inflater.inflate(R.layout.food_type_row, null);
        final ViewHolder viewHolder = new ViewHolder();
        viewHolder.foodType = (CheckBox) newView.findViewById(R.id.foodType);
        newView.setTag(viewHolder);
    } else {
        newView = convertView;
    }

    final ViewHolder holder = (ViewHolder) newView.getTag();

    holder.foodType.setText(foodTypeList.get(position).getName());
    holder.foodType.setChecked(checkBoxState[position]);
    holder.foodType.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            if (((CheckBox) v).isChecked()) {
                checkBoxState[position] = true;
            } else {
                checkBoxState[position] = false;
            }
        }
    });

    return newView;
}

ListView 行:

<CheckBox
    android:id="@+id/foodType"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:clickable="false"
    android:text="Checkbox"
    android:textSize="16sp"/>

我知道很多关于这个的话题已经存在,但我还没有找到一个有同样问题的话题......

请帮帮我!

【问题讨论】:

    标签: android listview button checkbox


    【解决方案1】:

    我认为您应该通过在您的 xml 中设置 android:clickable="false" 来使您的 CheckBoxs 无法点击。那么当用户点击项目并触发OnItemClickListener 时,您应该手动切换CheckBox 的状态。

    【讨论】:

    • 我在这个活动中没有使用任何EditText...我没有得到你的答案
    • 对不起,这是一个错误。我的意思是CheckBox。查看我编辑的答案。
    • 正如您在我发布的代码中看到的那样,android:clickable 已经设置为 false
    • 那么,也许您应该创建一个自定义视图,其中复选框状态为可绘制且不可点击,并使用它而不是默认复选框。但我认为如果您将 clickable 设置为 false,您的视图不应拦截触摸事件。
    • @clementino36 我认为当您将 clickListener 设置为复选框时,它会隐式地将复选框可点击设置为 true。删除那个监听器,我认为一切都会好起来的。
    【解决方案2】:

    我认为你应该只在你的 newView 上应用 onclicklistener,当点击视图时它会被激活,然后你可以根据它的位置来切换复选框。

    【讨论】:

      猜你喜欢
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 2015-02-24
      • 1970-01-01
      • 2011-11-15
      • 2012-12-15
      相关资源
      最近更新 更多