2

我从 ArrayAdapter 创建了一个 ListView。ListView 的每一行都有一个 ImageView 和一个 TextView。现在我使用 setOnItemClickListener 处理点击事件

lv = getListView();
    lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            CategoryInfo cat = (CategoryInfo) lv
                    .getItemAtPosition(position);
            showGameByCategory(Long.valueOf(cat.getId()), cat.getName());
        }
    });

当我单击一行时,它将开始另一个活动。在那个活动中,我有一个返回 ListView 的按钮。当单击该按钮时,我会调用Activity.finish();.

这是问题所在:我第一次打开 ListView 并单击任何项​​目时,它工作正常并打开新活动。但是当我单击按钮返回并返回 ListView 时,我无法单击任何项​​目。我的应用程序有很多选项卡,如果我切换到另一个选项卡并切换回 ListView,我可以再次单击 ListView 项。但是每当我点击按钮返回时,这些项目都是不可点击的。

我在 2 个不同的操作系统上进行了测试,它在 Android 2.3 上正常工作,但在 Android 4.0 上发生了这个错误。

有谁知道如何解决这一问题?

编辑:这是我的布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:background="@drawable/listitem_selector_odd"
    android:padding="6dip" >

    <RelativeLayout
        android:layout_width="0dip"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/avatar"
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:layout_marginRight="6dip" 
            android:layout_alignParentLeft="true"/>

        <TextView
            android:id="@+id/toptext"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_toRightOf="@+id/avatar"
            android:layout_marginRight="6dip"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:textColor="#000000"
            android:textSize="18dp"
            android:textStyle="bold" >
        </TextView>

        <ImageView
            android:id="@+id/arrow"
            android:layout_width="10dip"
            android:layout_height="15dip"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginLeft="6dip"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:src="@drawable/arrow_icon" />
    </RelativeLayout>

</LinearLayout>
4

3 回答 3

1

I had exactly the same problem as you. Even stranger, it happened on some tablet 4.0 or 4.1, while it didn't happen on a phone 4.1. Using "descendentFocusabilty=blocksDescendants" didn't solve it.

Following the idea of user1603602, I ask for the invalidation of Views of the list (hence a redraw of elements of the list) each time the View becomes visible:

@Override
protected void onWindowVisibilityChanged(int visibility) {
    super.onWindowVisibilityChanged(visibility);
    if (visibility == View.VISIBLE) {
        list.invalidateViews();
    }
}

As it reloads each items of the list, it can be annoying if you load images with animations for example, but it solves the problem, and it keep the scrolled position.

于 2013-08-30T12:14:48.550 回答
0

我有同样的问题,只是想出了一个解决方法。删除列表视图,然后将其添加回来。这将强制视图刷新到原始工作状态。

例如,如果您ListView lvLinearLayout lout

 lout.removeView(lv);
 lout.addView(lv);

确保从 UI 线程调用它。

于 2012-08-16T14:52:47.657 回答
0

我认为这与此处描述的问题相同

我使用了一个包含视图数组的自定义适配器。在 getView(position, ...) 中,我返回指定位置的视图。显然,ListView 不喜欢这样,有时(特定于平台)会回收不应该回收的视图。

于 2013-10-07T18:30:40.663 回答