使用复选框在android listview中未触发复选框单击事件

时间:2013-12-24 05:08:42

标签: android checkbox

我正在尝试用复选框实现一个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;
}

}

4 个答案:

答案 0 :(得分:3)

你在xml中提到android:clickable="false"的{​​{1}} ...所以checkBox无法监听click事件......最好把监听器放在Adapter类中。

checkBox而不是setOnCheckedChangeListener

setOnClickListener

答案 1 :(得分:1)

您可以使用该属性

android:descendantFocusability="afterDescendants" 
在listview xml中。我认为这会有所帮助。让我知道结果。

答案 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) 
            {


            }
    });