最近在公司写下面一个界面时,遇到了一个bug,item可以点击,但是checkbox无法点击选中
下面是我之前写的一个item的自定义布局类:
package com.chemanman.manager.view.view; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.CheckBox; import android.widget.Checkable; import android.widget.LinearLayout; import android.widget.TextView; import com.chemanman.manager.R; /** * 作者:dream on 2016/3/29 18:53 * 邮箱:1774866723@qq.com */ public class PaymentSingleView extends LinearLayout { CheckBox ivIsCheck; DisplayView viewWayBillNo; TextView tvWayBillTime; TextView tvFromAndTo; DisplayView viewPayMethordAndValue; TextView tvSenderAndReceiver; TextView tvDescriptionInfo; public PaymentSingleView(Context context) { super(context); initView(context); } public PaymentSingleView(Context context, AttributeSet attrs) { super(context, attrs); initView(context); } public PaymentSingleView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(context); } private void initView(Context context) { // 加载view LayoutInflater inflater = LayoutInflater.from(context); View convertView = inflater.inflate(R.layout.list_item_payment_nopay, this, true); ivIsCheck= (CheckBox) convertView.findViewById(R.id.check_payment); tvFromAndTo= (TextView) convertView.findViewById(R.id.from_and_to); tvDescriptionInfo= (TextView) convertView.findViewById(R.id.description_info); tvSenderAndReceiver= (TextView) convertView.findViewById(R.id.sender_and_receiver); tvWayBillTime= (TextView) convertView.findViewById(R.id.way_bill_time); viewWayBillNo= (DisplayView) convertView.findViewById(R.id.way_bill_no); viewPayMethordAndValue= (DisplayView) convertView.findViewById(R.id.payMethod_and_value); } }
界面显示都没有问题,但是就是checkbox无法选中,查了一些资料,发现item的外部监听会掩盖内部子组件的监听事件 有一种办法是让自定义的布局类实现Checkable接口,代码更改如下:
package com.chemanman.manager.view.view; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.CheckBox; import android.widget.Checkable; import android.widget.LinearLayout; import android.widget.TextView; import com.chemanman.manager.R; /** * 作者:dream on 2016/3/29 18:53 * 邮箱:1774866723@qq.com */ public class PaymentSingleView extends LinearLayout implements Checkable { CheckBox ivIsCheck; DisplayView viewWayBillNo; TextView tvWayBillTime; TextView tvFromAndTo; DisplayView viewPayMethordAndValue; TextView tvSenderAndReceiver; TextView tvDescriptionInfo; public PaymentSingleView(Context context) { super(context); initView(context); } public PaymentSingleView(Context context, AttributeSet attrs) { super(context, attrs); initView(context); } public PaymentSingleView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(context); } private void initView(Context context) { // 加载view LayoutInflater inflater = LayoutInflater.from(context); View convertView = inflater.inflate(R.layout.list_item_payment_nopay, this, true); ivIsCheck= (CheckBox) convertView.findViewById(R.id.check_payment); tvFromAndTo= (TextView) convertView.findViewById(R.id.from_and_to); tvDescriptionInfo= (TextView) convertView.findViewById(R.id.description_info); tvSenderAndReceiver= (TextView) convertView.findViewById(R.id.sender_and_receiver); tvWayBillTime= (TextView) convertView.findViewById(R.id.way_bill_time); viewWayBillNo= (DisplayView) convertView.findViewById(R.id.way_bill_no); viewPayMethordAndValue= (DisplayView) convertView.findViewById(R.id.payMethod_and_value); } @Override public void setChecked(boolean checked) { ivIsCheck.setChecked(checked); } @Override public boolean isChecked() { return ivIsCheck.isChecked(); } @Override public void toggle() { ivIsCheck.toggle(); } }
实现Checkable接口,并设置checkbox的选择模式(sh)
mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
并在对应的xml布局文件中设置属性
android:clickable="true" android:focusable="false"
相关推荐
android 的listview 内部item的布局包含checkbox控件时,会遇到常见的问题:1.checkbox无法选择;2.选择的checkbox后滑动listview内容时会checkbox选择的值会刷新成原来状态值(即没选中);3.选择listview所有checkbox...
关键在于监听CheckBox的单击事件,可以通过在`getView()`方法中设置CheckedChangeListener,或者在CheckBox的布局文件中定义一个OnCheckedChangeListener。然后在回调中更新相关数据源,并调用`notifyDataSetChanged...
2. 在适配器的`getView()`方法中,设置CheckBox并处理点击事件。 3. 使用convertView提高性能。 4. 定义接口回调,通知应用层选中状态变化。 5. 设置适配器到ListView上。 以上就是关于在Android中如何在ListView中...
这个解决方案可以将 ListView 子项中的 CheckBox 与 ListView 分离出来,即点击 ListView 的子项实现的是查看 ListView 子项的内容,点击子项中的 CheckBox 来实现 CheckBox 的选中与否。 首先,我们需要创建一个...
总结来说,解决ListView复用checkBox的问题,关键在于适当地在`getView()`方法中设置checkBox的状态,并且在点击事件中更新数据源和选中计数。这样,即使视图被复用,也能确保每个checkBox的状态正确反映其对应的...
这个项目是Android studio...3、点击ListViewItem选中响应Item里的CheckBox;4、计算选中的项数已经相应UI的隐显增强用户体验;5、自定义AlertDialog布局。全部自己研究编写,测试运行Ok,为真实项目的所用的简化Demo。
然后在Adapter的`getView()`方法中,实例化这个布局,并将CheckBox与数据绑定: ```java @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if ...
然而,当需要在ListView的每一项中加入可勾选的checkbox时,我们不能简单地在item布局中添加一个标准的Checkbox,因为这会导致点击事件冲突,用户体验也会受到影响。为了解决这个问题,我们可以自定义一个Checkable...
- 通常在ListView的item布局文件中添加CheckBox元素,并设置其初始状态。 3. **getView()方法** - 在自定义Adapter的getView()方法中,根据数据动态设置CheckBox的状态。 - 当数据改变时,调用Adapter的...
在Adapter的getView()方法中,我们需要根据数据项的实际情况来设置CheckBox的选中状态。 例如: ```java public class CustomAdapter extends BaseAdapter { private List<DataItem> dataList; @Override ...
在Adapter中,我们需要为每个ListView的Item创建一个布局,该布局包含一个CheckBox。然后,我们可以在`getView()`方法中处理CheckBox的状态。 ```java public View getView(int position, View convertView, ...
然后,在适配器的getView()方法中,可以为每个ListView项设置独立的点击监听器。对于CheckBox,我们可以设置CheckedChangeListener来监听其状态变化;对于ListView项本身,可以设置OnClickListener来处理文本的点击...
为解决此问题,需要在getView()方法中设置CheckBox的状态,根据数据模型的选中状态进行初始化。 2. 事件冲突:ListView的点击事件和CheckBox的点击事件可能会相互干扰。通过设置OnCheckedChangeListener,确保只有在...
在`getView()`方法中,我们需要创建或复用一个包含Checkbox的布局。布局可以预先设计好,例如一个包含TextView和Checkbox的LinearLayout。然后,通过findViewById()方法找到Checkbox,将其设置为单选或多选模式,并...
在这里,我们可以创建包含Checkbox的布局,并将它设置为ListView的item。 2. **CheckBox的布局**: - 在XML布局文件中,定义一个包含Checkbox的ListView item模板。例如: ```xml <CheckBox android:id="@+id/...
解决这个问题的方法是在适配器中保存CheckBox的状态,并在getView()方法中根据这个状态设置CheckBox的选中与否。 此外,我们还可以使用onItemClickListener监听ListView的点击事件,这样在点击列表项时可以获取到...
6. **避免在onItemClick()中操作CheckBox**:通常,ListView的`onItemClick()`事件会被CheckBox的点击事件截获,导致无法正常触发ListView的点击事件。因此,应避免在`onItemClick()`中直接操作CheckBox,而是在...
`getView()` 方法中,我们设置了Checkbox的文本和初始选中状态,并添加了一个CheckedChangeListener,当Checkbox的状态改变时,会触发这个监听器,更新对应位置的选中状态。 接下来,你需要在布局文件(如 `list_...
2. 在代码中,实例化这个自定义的ListViewItem,并为其创建一个CheckBox。 ```csharp CustomListViewItem item = new CustomListViewItem(); item.Text = "Item1"; item.CheckBox = new CheckBox(); item.CheckBox....