【问题标题】:Button Inside Android ListView doesnt respond to clicksAndroid ListView 内的按钮不响应点击
【发布时间】:2012-06-06 18:22:38
【问题描述】:

我有一个默认的 ListView,我已经为列表项添加了我的自定义视图,但这些视图中的按钮大部分时间都不可点击。当按钮接收到点击事件时,我会输出一个 Log.v,但我必须点击该按钮几乎十几次才能注册点击。

我遇到的另一个与他相关的问题是,当按下按钮时,我希望发生动画,显示菜单从其下方滑出。目前我已经尝试了几种不同的方法,比如为视图创建一个自定义类,而不是只使用布局充气器来获取视图的 relativeLayout 对象,但没有任何工作正常。我什至尝试过使用listview.getAdapter().notifyDataSetChanged();,但是当我想要动画时,它只有一个用于扩展视图的弹出位置。

我到处搜索,似乎唯一可能的解决方案是重写我自己的自定义列表视图或使用带有滚动视图的线性布局。后者似乎更容易,但我认为它几乎不像列表视图那样优化。

任何建议将不胜感激,如果您需要查看一些代码,请告诉我...

谢谢!

更新:

getView() 包含以下内容:

    Holder hold;
    convertView = friends.get(position);
    hold = new Holder();
    hold.pos = position;
    convertView.setTag(hold);
    return convertView;

目前,我基本上将ArrayList<RelativeLayout> 传递给适配器,这样我就不必每次都创建一个新视图,这样当我向下滚动时动画将保持动画...

在此活动的OnCreate() 中,我使用下一个代码设置了ArrayList<RelativeLayout>,但这只是暂时的,因为我计划稍后使用另一种方法,例如异步任务或其他东西,以便此视图包含一些数据。 ..

    RelativeLayout temp;
    for(int i=0; i<30; i++){
        temp = (RelativeLayout) inflater.inflate(R.layout.list_item, null);

        final LinearLayout extraListItemInfo = (LinearLayout) temp.findViewById(R.id.extraListItemInfo);

        Button infoBtn = (Button) temp.findViewById(R.id.infoBtn);
        infoBtn.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                Log.v("ListItem", "Button has been clicked... ");
                extraListItemInfo .setVisibility(View.VISIBLE);

                ExpandAnimation closeAnim = new ExpandAnimation(extraListItemInfo , animHeight);
                closeAnim.setDuration(750);
                closeAnim.setFillAfter(true);

                if(extraListItemInfo .getTag() == null || !extraListItemInfo .getTag().equals("expanded")){
                    extraListItemInfo .getLayoutParams().height = 0;
                    friendInfoList.startAnimation(closeAnim.expand());
                    extraListItemInfo .setTag("expanded");
                }else if(extraListItemInfo .getTag().equals("expanded")){
                    extraListItemInfo .startAnimation(closeAnim.collapse());
                    extraListItemInfo .setTag("closed");
                }
                //((BaseAdapter) listview.getAdapter()).notifyDataSetChanged(); i tried it here once but then left it
    //as the only action inside the listview's onitemclick()
            }
        });

        listItems.add(temp);
    }

这是我正在使用的列表项:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@color/darkgrey"
    android:paddingBottom="5dp" >

    <LinearLayout
        android:id="@+id/extraListItemInfo "
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/listItemInfo"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="-10dp"
        android:background="@color/grey"
        android:orientation="vertical"
        android:visibility="gone" >


        <RelativeLayout
            android:id="@+id/RelativeLayout04"
            android:layout_width="match_parent"
            android:layout_height="@dimen/activity_list_height"
            android:layout_marginTop="5dp" >

            <ImageView
                android:id="@+id/ImageView04"
                android:layout_width="wrap_content"
                android:layout_height="25dp"
                android:layout_margin="5dp"
                android:src="@drawable/logo_d" />

            <TextView
                android:id="@+id/TextView04"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_toRightOf="@+id/ImageView04"
                android:text="TextView"
                android:textColor="@color/black"
                android:textSize="17dp" />
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/RelativeLayout03"
            android:layout_width="match_parent"
            android:layout_height="@dimen/activity_list_height" >

            <ImageView
                android:id="@+id/ImageView03"
                android:layout_width="wrap_content"
                android:layout_height="25dp"
                android:layout_margin="5dp"
                android:src="@drawable/logo_d" />

            <TextView
                android:id="@+id/TextView03"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_toRightOf="@+id/ImageView03"
                android:text="TextView"
                android:textColor="@color/black"
                android:textSize="17dp" />
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/RelativeLayout02"
            android:layout_width="match_parent"
            android:layout_height="@dimen/activity_list_height" >

            <ImageView
                android:id="@+id/ImageView02"
                android:layout_width="wrap_content"
                android:layout_height="25dp"
                android:layout_margin="5dp"
                android:src="@drawable/logo_d" />

            <TextView
                android:id="@+id/TextView02"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_toRightOf="@+id/ImageView02"
                android:text="TextView"
                android:textColor="@color/black"
                android:textSize="17dp" />
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/relativeLayout1"
            android:layout_width="match_parent"
            android:layout_height="@dimen/activity_list_height" >

            <ImageView
                android:id="@+id/imageView1"
                android:layout_width="wrap_content"
                android:layout_height="25dp"
                android:layout_margin="5dp"
                android:src="@drawable/logo_d" />

            <TextView
                android:id="@+id/textView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_toRightOf="@id/imageView1"
                android:text="TextView"
                android:textColor="@color/black"
                android:textSize="17dp" />
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/RelativeLayout01"
            android:layout_width="match_parent"
            android:layout_height="@dimen/activity_list_height">

            <ImageView
                android:id="@+id/ImageView01"
                android:layout_width="wrap_content"
                android:layout_height="25dp"
                android:layout_margin="5dp"
                android:src="@drawable/logo_d" />

            <TextView
                android:id="@+id/TextView01"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_toRightOf="@+id/ImageView01"
                android:text="TextView"
                android:textColor="@color/black"
                android:textSize="17dp" />
        </RelativeLayout>
    </LinearLayout>
        <RelativeLayout
        android:id="@+id/listItemInfo"
        android:layout_width="wrap_content"
        android:layout_height="95dp"
        android:background="@drawable/friend_cell_background2x"
        android:clickable="true" >


        <RelativeLayout
            android:id="@+id/leftLayout"
            android:layout_width="90dp"
            android:layout_height="match_parent" >
            <ImageView
                android:id="@+id/imgCompany"
                android:layout_width="60dp"
                android:layout_height="50dp"
                android:layout_centerHorizontal="true"
                android:layout_marginLeft="10dp"
                android:layout_marginTop="10dp"
                android:scaleType="centerInside"
                android:src="@drawable/user2x" />
            <ImageView
                android:id="@+id/imageView2"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:layout_alignParentBottom="true"
                android:layout_centerHorizontal="true"
                android:scaleType="fitXY"
                android:src="@drawable/online_indicator2s" />

        </RelativeLayout>


        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:layout_marginTop="5dp"
            android:layout_toRightOf="@+id/leftLayout"
            android:background="@android:color/transparent"
            android:gravity="left|center"
            android:orientation="vertical"
            android:paddingLeft="5dp" >


            <TextView
                android:id="@+id/lblCompanyName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Contact Name"
                android:textColor="@color/white"
                android:textSize="18dp"
                android:textStyle="bold" >

            </TextView>


            <TextView
                android:id="@+id/lblReawrdDesc"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Last Played Offer"
                android:textColor="@color/white"
                android:textSize="17dp" >

            </TextView>
        </LinearLayout>

        <ImageView
            android:id="@+id/imageView4"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_marginRight="5dp"
            android:src="@drawable/facebook_btn2x" />
        <Button
            android:id="@+id/infoBtn"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_alignParentBottom="true"
            android:layout_alignRight="@+id/imageView4"
            android:background="@drawable/info_btn2x"
            android:clickable="true" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="13dp"
            android:layout_toLeftOf="@+id/infoBtn"
            android:text="Follows 30+"
            android:textColor="@color/white"
            android:textSize="11dp" />

        <Button
            android:id="@+id/button1"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="75dp"
            android:layout_height="20dp"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="10dp"
            android:layout_marginRight="10dp"
            android:layout_toLeftOf="@+id/textView2"
            android:background="@drawable/fan_btn2x"
            android:text="Fans 30+"
            android:textColor="@color/white"
            android:textSize="11dp" />


        <ImageView
            android:id="@+id/imageView5"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_alignParentTop="true"
            android:layout_toLeftOf="@+id/imageView4"
            android:src="@drawable/google_btn2x" />

    </RelativeLayout>

</RelativeLayout>

对于任何可能使内容难以阅读的布局问题,我深表歉意……但我希望这可以帮助你们理解我的问题……谢谢

更新 2:

所有这些答案在某种程度上都有帮助,但我认为我必须首先解决的主要问题是为什么按钮在我首先滚动离开该 listItem,然后返回它,然后再次单击该按钮...如果有人可以帮助找到我认为的解决方案,那么其他所有问题都会更容易解决... 谢谢...

根据要求提供屏幕截图,但请记住,这张照片是在三星 Galaxy Tab 10.1 上拍摄的,由于我在这个更大的屏幕上使用了相同的布局,它看起来与我通常测试的手机上的效果有很大不同(摩托罗拉 droid x 未root,无法截图...)

另一个更新: 通过扩展 ArrayAdapter 而不是基本适配器,我设法使点击和动画效果很好。可悲的是,我仍然遇到问题,因为只有列表的下半部分是可点击的。列表的上半部分仍然像以前一样出现非常故障的点击事件......关于这次发生的事情有什么想法吗?谢谢...

【问题讨论】:

  • 请包含相关代码,以便我们了解单击侦听器未侦听的原因。
  • 适配器的getView() 的代码是什么?此外,如果您正在膨胀行,请发布 xml。
  • 在你的 xml 文件中使用 android:focasable=false 我可能会工作...
  • 可聚焦的更改不起作用...似乎我无法修复我之前从其他人那里发现的错误,这是按钮的点击在视图更改之前未注册的地方,例如通过滚动事件。 ..我在日志中看到了这一点,因为我多次触摸按钮而没有任何反应,然后我滚动列表,然后由于某种原因从所有这些按钮点击中获取事件...
  • 感谢您的屏幕截图。我仍然没有看到任何明显的东西,所以我会问一个基本问题。您是否尝试过将infoBtn 放大以确保您按下按钮?

标签: android android-listview android-button


【解决方案1】:

这并不是一个真正的答案,但在重写了几次之后,我设法修复了它,使它完全按照我想要的方式运行。

这次我将所有数据与每个视图分开,并让每个列表项成为一个自定义类,继承 RelativeLayout 并为其特定的 infoBtn 实现自己的 OnClickListener

我的适配器现在只是扩展了 ArrayAdapter 并覆盖了这个 getView() 方法:

public View getView(int position, View convertView, ViewGroup parent) {

    if(convertView != null && (convertView instanceof FriendListItem2))
        ((FriendListItem2) convertView).setFriendInfo(friends.get(position));
    else
        convertView = new FriendListItem2(getContext(), friends.get(position));

    return convertView;
}

最后,在此页面的主要活动中,我只需将ListView 设置为我将数据传递到的适配器。

这一切都比我以前更干净了,我希望它没有对代码进行多次重写来使它正确。希望有人可以从中受益,尽管我仍然不知道为什么我之前遇到了问题。

感谢您之前的所有建议。

【讨论】:

  • 恭喜(如果有效,那就是答案)!支持返回并结束问题。
【解决方案2】:

这是为每一行创建的复杂布局...

无论如何,当您使用 new 关键字时,您正在创建一个不同的范围。简而言之,您的 onClickListener 不会看到您希望它看到的 30 个不同的 extraListItemInfo 引用。

试试这样的:

@Override
public void onClick(View v) {
    LinearLayout extraListItemInfo = v.getParent();
    ...

【讨论】:

  • 我认为这会对我有所帮助,但问题不在于我如何处理这些事件,它首先是获取这些事件......请参阅更新 2 以获取说明。另外,我试过了,结果和以前一样,只是我同意这是更好的方法。
  • 你能发一个屏幕截图吗?你是,我错过了你的问题的根本原因。我理解你的问题(现在),但对布局有点困惑。
  • 还有其他想法吗?我应该放弃我所拥有的并尝试重新开始吗?
  • 抱歉,没有新想法。我只是不明白为什么 OnClickListener 不会在每次点击时触发......我建议尝试结合 RelativeLayout 兄弟姐妹,但这只是为了提高效率。
  • 如果你想看看我的新解决方案,我已经修好了。
【解决方案3】:

尝试在放置子视图的顶级布局中使用此属性。

android:descendantFocusability="blocksDescendants"

这有点棘手,但我建议如果上述行不起作用,请尝试在从按钮中删除 focusable=true 和 focusable="false" 之间切换。它应该可以工作。

干杯!

【讨论】:

    【解决方案4】:

    android:onClick="onClick" 添加到您的按钮xml,它会调用onClick() 方法

    【讨论】:

    • 点击事件会到正确的位置,只是它们不会被调用,直到我滚动离开该列表项,滚动回它,然后再次按下按钮......
    【解决方案5】:

    我遇到了同样的问题。尝试从相对布局中获取“android:clicable="true"”。当您这样做时,活动期望您将 setOnClickListener 设置为该 RelativeLayout 。它对我有用

    【讨论】:

      【解决方案6】:

      您可以从 ListViewAdapter 类的 getView() 方法触发按钮上的单击事件。 看到这个问题

      Android : How to set onClick event for Button in List item of ListView.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-29
        • 1970-01-01
        • 2017-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多