我有一个带有自定义适配器的ListView。 ListView将包含一个复选框列表,每次单击一个复选框时,我想在自定义视图中添加/删除复选框,因此我认为实现此目的的最佳方法是使用onItemClickListener。
问题是这不起作用,onItemClickListener中的代码永远不会运行。我发现很多关于同样问题的问题,但是对他们起作用的解决方案并不适用于我。
这是我的代码:
MultichoiceAnswerView.java
private void init(Context context) {
multichoiceAdapter = new MultichoiceAdapter(context, alternatives);
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
layoutInflater.inflate(R.layout.view_answer_multichoice, this);
listAlternatives = (ListView) this.findViewById(R.id.list_alternatives);
listAlternatives.setAdapter(multichoiceAdapter);
// This is where I tried to add a onItemClickListener, with no success.
super.init();
}
MultichoiceAdapter.java
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
String alternative = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_multichoice, parent, false);
}
CheckBox checkBoxAlternative = (CheckBox) convertView.findViewById(R.id.checkBox_alternative);
checkBoxAlternative.setText(alternative);
return convertView;
}
view_answer_multichoice.xml
<ListView
android:id="@+id/list_alternatives"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:divider="@null"
android:dividerHeight="0dp" />
item_multichoice.xml
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center">
<android.support.v7.widget.AppCompatCheckBox
android:id="@+id/checkBox_alternative"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="16dp"
android:layout_marginLeft="16dp"
android:text="Answer"/>
</LinearLayout>
可以在此GitHub仓库(分支“卡片”)中访问该项目:https://github.com/WeeRox/yaffect-android
我尝试过的解决方案:
在复选框上设置focusable="false"
。
在复选框上设置focusableInTouchMode="false"
(包含和不包含focusable="false"
)
将descendantFocusability="blocksDescendants"
设置为LinearLayout
在适配器中设置checkBoxAlternative.setFocusable(false);
(虽然没有尝试其他的东西)
上述解决方案均无效。
我确实通过在复选框上设置clickable="false"
找到一种(显而易见的)方法来解决这个问题,但是如果我可以让它工作而无需以编程方式检查框,那就太棒了。
也许有一个我没有想过的干净的解决方法(也许我可以使用RecyclerView或类似的东西)。 那么,我该如何解决这个问题呢? 为什么上述解决方案对我不起作用?