2

我有一个默认的 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 而不是基本适配器,我设法使点击和动画效果很好。可悲的是,我仍然遇到问题,因为只有列表的下半部分是可点击的。列表的上半部分仍然像以前一样出现非常故障的点击事件......关于这次发生的事情有什么想法吗?谢谢...

4

6 回答 6

3

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

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

我的适配器现在只是扩展了 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使用我将数据传递到的适配器进行设置。

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

感谢您之前的所有建议。

于 2012-06-20T20:16:16.207 回答
2

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

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

尝试这样的事情:

@Override
public void onClick(View v) {
    LinearLayout extraListItemInfo = v.getParent();
    ...
于 2012-06-06T19:33:28.780 回答
2

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

android:descendantFocusability="blocksDescendants"

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

干杯!

于 2012-09-20T20:17:21.220 回答
0

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

于 2012-06-06T19:08:20.690 回答
0

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

于 2012-07-24T10:42:26.617 回答
0

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

Android:如何在 ListView 的 List 项中为 Button 设置 onClick 事件

于 2013-01-02T09:26:16.947 回答