Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ListView中的按钮不响应点击_Android_Android Listview_Android Button - Fatal编程技术网

Android ListView中的按钮不响应点击

Android ListView中的按钮不响应点击,android,android-listview,android-button,Android,Android Listview,Android Button,我有一个默认的ListView,我为列表项添加了自定义视图,但是这些视图中的按钮在大多数情况下是不可单击的。当按钮接收到点击事件时,我会输出一个Log.v,但是我必须点击按钮十几次,它才会注册点击 与此相关的另一个问题是,当按下按钮时,我希望出现一个动画,显示从其下方滑出的菜单。目前,我已经尝试了几种不同的方法,比如为视图创建一个自定义类,而不是仅仅使用布局充气器来获取视图的relativeLayout对象,但是没有任何方法能够正常工作。我甚至尝试过使用listview.getAdapter()

我有一个默认的ListView,我为列表项添加了自定义视图,但是这些视图中的按钮在大多数情况下是不可单击的。当按钮接收到点击事件时,我会输出一个Log.v,但是我必须点击按钮十几次,它才会注册点击

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

我到处都搜索过,似乎唯一可能的解决方案是重写我自己的自定义listview或使用带有scrollview的linearlayout。后者似乎更简单,但我认为它没有listview那么优化

任何建议将不胜感激,如果你需要看到一些代码,请让我知道

谢谢

更新:

getView()
包含以下内容:

    Holder hold;
    convertView = friends.get(position);
    hold = new Holder();
    hold.pos = position;
    convertView.setTag(hold);
    return convertView;
基本上,我现在会将一个
ArrayList
传递给适配器,这样我就不必每次都创建一个新视图,这样当我向下滚动时,动画将保持动画状态

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

    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);
    }
相对温度;

对于(int i=0;i将
android:onClick=“onClick”
添加到按钮xml,它将使它调用
onClick()
方法,这是为每一行创建的复杂布局

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

试着这样做:

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

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

这次我将所有数据与每个视图分开,让每个列表项都是一个自定义类,继承了
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
,然后将数据传递给该适配器

这比我以前做的要干净得多,我希望代码没有经过几次重写才正确。希望有人能从中受益,尽管我仍然不知道为什么我以前会遇到问题


感谢您之前的所有建议。

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

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

android:descendantFocusability="blocksDescendants"
这有点棘手,但我建议如果上面这一行不起作用,试着在移除按钮中的focusable=true和focusable=“false”之间切换。应该可以


干杯!

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


.

请包含相关代码,为我们提供有关为什么单击侦听器未侦听的上下文。适配器的
getView()的代码是什么
?此外,如果您正在扩大行数,请在您的xml文件中发布xml.use android:focasable=false我可能正在工作…可聚焦的更改不起作用…我似乎无法修复我先前从其他人那里发现的错误,在视图更改之前,按钮的单击不会注册,例如通过滚动事件…我看到了在日志中,因为我多次触摸按钮都没有发生任何事情,然后我滚动列表,然后出于某种原因从所有这些按钮点击中获取事件…感谢屏幕截图。我仍然没有看到任何明显的内容,所以我要问一个基本问题。您是否尝试过将
infoBtn
放大以确保点击按钮?点击事件将转到正确的位置,只是在我从该列表项滚动到该列表项,滚动回该列表项,然后再次按下按钮之前,它们不会被调用…我认为这将对我有所帮助,但问题不在于我如何处理事件,而是首先获取事件…请参阅更新2以了解详细信息。此外,我尝试了这个,结果和以前一样,只是我同意这是更好的方法。你能发布一个屏幕截图吗?你是对的,我错过了你问题的根本原因。我理解你的问题(现在)但是我对布局有点困惑。还有其他想法吗?我应该放弃我拥有的,重新开始吗?对不起,没有新的想法。我只是不明白为什么OnClickListener不能在每次点击时启动…我建议尝试合并RelativeLayout兄弟,但这只是为了效率。如果你想看到我的n,我已经修复了它ew解决方案。祝贺你(如果它有效,这是一个答案)!投票支持回来并结束问题。
android:descendantFocusability="blocksDescendants"