我正在尝试用复选框实现一个android listview。但是,我无法获取复选框的点击事件。
如果我将复选框监听器放在适配器类上,我可以使代码工作。但是我需要主类的信息。
使用主类,我可以在单击时获取listview的事件,但不能使用lv.onItemClick获取复选框。但是,我需要单击列表视图一次,然后再次单击复选框,以便触发复选框事件。我需要单独的复选框事件和listview点击事件。有帮助吗?感谢
XML FOR LIST 相对布局之外仍然存在线性布局。
<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" );
} });
}
});
}
公共类CustAdapHeaderWithCbPaper扩展了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;
}
}
答案 0 :(得分:3)
你在xml中提到android:clickable="false"
的{{1}} ...所以checkBox无法监听click事件......最好把监听器放在Adapter类中。
您checkBox
而不是setOnCheckedChangeListener
setOnClickListener
答案 1 :(得分:1)
您可以使用该属性
android:descendantFocusability="afterDescendants"
答案 2 :(得分:0)
在第一个if(i!=null)
条件之外找到复选框并执行您需要的相同工作
例如:
holder.cb.setOnClickListener(new View.OnClickListener() {
public void onClick(View v)
{
Log.w("do something", "do something" );
} });
要获取整个RelativeLayout
点击事件,请在 xml 中提供 ID 并执行相同操作
答案 3 :(得分:0)
首先从Xml文件
中删除此行android:button=null
并将此行添加到您的复选框
android:focusable="false"
然后,使用此代码,它将适合您
checkbox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(checkBox.isChecked())
{
// do what You want to perform on when check box is checked
}
else
{
}
}
});
并为列表视图提供单独的事件,如下所示:
lv.setOnItemClickListener(new OnItemClickListener()
{
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
}
});