android - 带有复选框的android ListView 中未触发复选框单击事件

标签 android checkbox

我正在尝试实现一个带复选框的 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/

相关文章:

android - 单击主页按钮时未调用 onActivityResult

android - 被告知项目在使用时未使用 gradle 构建系统

javascript - 复选框限制功能发生后复选框变得不可点击reactjs

javascript - 使用纯 JavaScript(不是 jQuery)触发复选框更改事件

java - 媒体播放器静音/取消静音太迟

Android getResource() 未定义错误

java - 为什么我不能从另一个类访问这个方法?

java - 蓝牙 HID 配置文件位于何处?

java - 如何根据json数组长度在对话框中添加动态复选框?

javascript - Jquery 复选框没有改变