【问题标题】:Checkbox click event not triggered in android listview with checkbox复选框单击事件未在带有复选框的 android listview 中触发
【发布时间】: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/…'。它在答案部分有数组适配器。
  • 如何编写自定义接口监听器?我需要主类中复选框的结果

标签: android checkbox


【解决方案1】:

您在 xml 中为 checkBox 提到 android:clickable="false"...所以复选框无法侦听单击事件..最好将侦听器放在 Adapter 类中..

你是setOnCheckedChangeListener而不是setOnClickListener

    checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
            // TODO Auto-generated method stub
        }
    });

【讨论】:

  • 我提到了 android:focusable="false",所以复选框只能显式获得焦点,默认情况下列表视图行应该获得焦点。
  • 嗨,即使我使用点击监听器也会得到同样的错误
  • 我需要监听的结果是主类。我应该怎么办?谢谢
【解决方案2】:

你可以使用属性

android:descendantFocusability="afterDescendants" 

在您的列表视图 xml 中。我认为这会有所帮助。让我知道结果。

【讨论】:

    【解决方案3】:

    在第一个 if(i!=null) 条件之外找到复选框并执行您需要的相同工作

    例如:

    holder.cb.setOnClickListener(new View.OnClickListener() {
                     public void onClick(View v) 
                     {
                         Log.w("do something", "do something" );
                     } });
    

    要获取整个 RelativeLayout 点击事件,请在 xml 中提供 id 并执行相同操作

    【讨论】:

    • 我需要在主类中而不是在适配器类中的 setClickListener。有什么帮助吗?谢谢
    • @user313408 最好在getView() 中编写点击监听器,为什么在main 中需要它。您希望复选框对象位于本地范围之外????
    【解决方案4】:

    首先从你的 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) 
                {
    
    
                }
        });
    

    【讨论】:

    • 嗨,但是如果我使用 onClick(View v) 会有一个错误
    • 这是因为我需要视图并且还需要列表视图的位置。有什么帮助吗?谢谢
    猜你喜欢
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多