我正在尝试实现一个带复选框的 android ListView 。但是,我无法获得我的复选框的点击事件。
如果我将复选框监听器放在适配器类上,我可以使代码正常工作。但是我需要主类的信息。
使用主类,我可以在单击时获取 ListView 的事件,但不能使用 lv.onItemClick 获取复选框。但是,我需要单击一次 ListView 并再次单击复选框才能触发复选框事件。我需要单独的复选框事件和 ListView 单击事件。有什么帮助吗?谢谢
列表的 XML Relative布局之外还有线性布局。
<RelativeLayout
android:background="@android:color/transparent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dip"
android:layout_marginRight="6dip"
android:layout_marginTop="6dip"
android:layout_marginBottom="6dip"
android:descendantFocusability="blocksDescendants"
android:layout_weight="1">
<TextView android:id="@+id/list_item_entry_title_paper"
android:textColor="@android:color/black"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_toLeftOf="@+id/cbPaper"
android:gravity="left"
android:layout_alignParentLeft="true"
android:singleLine="true"
android:focusable="false"
android:clickable="false"
android:focusableInTouchMode="false"
android:fadingEdge="horizontal" />
<TextView android:id="@+id/list_item_entry_summary_paper"
android:layout_alignParentLeft="true"
android:gravity="left"
android:layout_toLeftOf="@+id/cbPaper"
android:textColor="@android:color/black"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/list_item_entry_title_paper"
android:layout_alignLeft="@id/list_item_entry_title_paper"
android:textAppearance="?android:attr/textAppearanceSmall"
android:singleLine="true"
android:focusable="false"
android:clickable="false"
android:focusableInTouchMode="false"
/>
<CheckBox
android:button="@null"
android:id="@+id/cbPaper"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_alignParentRight="true"
android:background="@drawable/customcbpaper"
android:layout_centerVertical="true"
android:focusable="false"
android:clickable="false"
android:focusableInTouchMode="false"
android:choiceMode="multipleChoice"
android:gravity="right" />
</RelativeLayout>
主事件处理程序
lv.setOnItemClickListener(new OnItemClickListener()
{
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
checkbox = (CheckBox) view.findViewById(R.id.cbPaper);
checkbox.setOnClickListener(new View.OnClickListener() {
public void onClick(View v)
{
Log.w("do something", "do something" );
} });
}
});
}
公共(public)类 CustApHeaderWithCbPaper 扩展 ArrayAdapter {
private Context context;
private ArrayList<Item> items;
private LayoutInflater vi;
public CustAdapHeaderWithCbPaper(Context context,ArrayList<Item> items) {
super(context,0, items);
this.context = context;
this.items = items;
vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
static class ViewHolder {
protected TextView a;
protected TextView b;
protected CheckBox cb;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
ViewHolder holder = null;
final int newPosition = position;
final Item i = items.get(position);
if (i != null) {
if(i.isSection()){
SectionItem si = (SectionItem)i;
v = vi.inflate(R.layout.list_item_section, null);
v.setOnClickListener(null);
v.setOnLongClickListener(null);
v.setLongClickable(false);
final TextView sectionView = (TextView) v.findViewById(R.id.list_item_section_text);
sectionView.setText(si.getTitle());
}
else //Not a section
{
EntryItemCheckBox ei = (EntryItemCheckBox)i;
v = vi.inflate(R.layout.list_item_entry_cb_paper, null);
holder = new ViewHolder();
holder.a = (TextView)v.findViewById(R.id.list_item_entry_title_paper);
holder.b = (TextView)v.findViewById(R.id.list_item_entry_summary_paper);
holder.cb = (CheckBox)v.findViewById(R.id.cbPaper);
final String titleCheck = ei.title.toString();
holder.cb.setTag(position);
holder.a.setText(ei.title);
holder.cb.setChecked(ei.selected);
v.setTag(holder);
v.setTag(R.id.list_item_entry_title_paper, holder.a);
v.setTag(R.id.list_item_entry_summary_paper, holder.b);
v.setTag(R.id.cbPaper, holder.cb);
}
}
return v;
}
最佳答案
你在 xml 中为 checkBox
提到了 android:clickable="false"
...所以 checkBox 不能监听点击事件..最好把Adapter 类中的监听器..
您setOnCheckedChangeListener
而不是setOnClickListener
checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
// TODO Auto-generated method stub
}
});
关于android - 带有复选框的android ListView 中未触发复选框单击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20755159/