【发布时间】:2014-05-03 23:05:16
【问题描述】:
我正在尝试使用复选框实现一个 android 列表视图。但是,我无法为我的复选框获取点击事件。
如果我将复选框侦听器放在适配器类上,我可以使代码工作。但是,我需要主课上的信息。
使用主类,我可以在单击时获取列表视图的事件,但不能使用 lv.onItemClick 获取复选框。但是,我需要单击一次列表视图并再次单击复选框才能触发复选框事件。我需要单独的复选框事件和列表视图单击事件。有什么帮助吗?谢谢
用于列表的 XML 在相对布局之外还有一个线性布局。
<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;
}
}
【问题讨论】:
-
您应该只将
checkbox listener放在适配器类中。然后通过自定义interface listeners通知main activity。 -
看看这个'stackoverflow.com/questions/20699062/…'。它在答案部分有数组适配器。
-
如何编写自定义接口监听器?我需要主类中复选框的结果