【问题标题】:ListView and Buttons inside ListViewListView 和 ListView 中的按钮
【发布时间】:2011-03-04 00:25:55
【问题描述】:

我想在ListView 中显示Button。 目标应该是点击ListView 行或按钮。

点击显示更多信息的行。 单击它显示在底部的按钮更多按钮。

与 GMAIL 应用相同。

右侧有一个复选框,点击底部的复选框后,出现按钮栏。

我的问题是在将按钮插入ListView 后,按钮不可点击。 如果我从按钮llButton.setClickable() 添加到LinearLayout,它就可以工作。但是,只有按钮。 ListView 本身不再对点击做出反应!

我试过this example

和上面一样的问题...

【问题讨论】:

  • 您是否尝试使用列表视图的上下文菜单?
  • this 可能会有所帮助
  • 是的,我有一个上下文菜单,但我也想添加一个复选框。
  • 也许我对this问题的回答可能会有所帮助。
  • “如果我从按钮添加到LinearLayout”,请修正这句话。看不懂。

标签: android listview button


【解决方案1】:

为了澄清这一点——似乎没有人说过这么简单的话——虽然不允许将可聚焦按钮与列表视图结合使用,但有一个更简单的解决方案。

接受的答案是给定的 - 在为列表项设置点击侦听器时,您应该始终这样做,所以 OP 不知道这一点是很愚蠢的。

如果您使用 XML 布局作为列表项,只需将按钮设置为具有以下属性,它也会使列表项成为可点击的:

android:focusable="false"

【讨论】:

  • 谢谢,它解决了我面临的一个问题!
  • 奇怪的是,这个技巧不适用于 ImageButton。知道吗?
  • 我想这应该不奇怪,因为 ImageButton 扩展了 ImageView,而 Button 扩展了 TextView。带有图像按钮。这个技巧确实有效,但必须在更改可见性后设置。 (那是我的问题)。
  • 不知道。感谢您扩展我的答案。
  • @arnab321 如果您以编程方式更改ImageButton 的可见性,则必须在可见性更改后调用setFocusable(false)
【解决方案2】:

将下面的行添加到您的列表项 XML。

android:descendantFocusability="blocksDescendants"

那么你的列表项将是这样的:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:descendantFocusability="blocksDescendants"
android:layout_height="wrap_content" >

    // Your layout objects here

</RelativeLayout>

【讨论】:

  • 这是解决我问题的唯一答案
【解决方案3】:

如果您使用的是自定义适配器,则在 ListView 中单击按钮将不起作用,因此您应该尝试使用以下代码检查 OnItemClickListener

listId.setOnItemClickListener(new AdapterView.OnItemClickListener() {
   public void onItemClick(AdapterView<?> list, View v, int pos, long id) {
      // Your code for item clicks
   }
});

【讨论】:

【解决方案4】:

要在单击按钮或列表项时触发事件,您可以执行以下操作:

你只处理onItemClick:

mListView.setOnItemClickListener(new ListView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> a, View v, int i, long l) {
        // handle click here
    }
);

在适配器中,您将按钮修改为不可点击/不可聚焦(或者在 xml 文件中执行此操作):

public class MyAdapter extends BaseAdapter {
    ...
    public View getView(int position, View convertView, ViewGroup parent) {
        .....  
        Button btn = view.findViewById(R.id.button);
        btn.setFocusable(false);
        btn.setClickable(false);               
    }
}

【讨论】:

    【解决方案5】:

    在我的情况下,我必须在 listView 中添加这个属性:

    <ListView
    ...
    android:clickable="true"
    ...
    </ListView>
    

    在适配器中,只需在按钮视图中添加点击侦听器。

    wrapper.getButtonHi().setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                DebugUtils.logDebug("Clickeado :: "+ mContact.getUserId());
            }
    });
    

    设置final变量很重要:

    public View getRowView(final int position, View convertView, ViewGroup parent) {
        final BrowseContactItemWrapper wrapper;
        final UserModel mContact = lstContact.get(position);
        .....
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-10
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 2021-04-26
      • 1970-01-01
      相关资源
      最近更新 更多