我从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>
答案 0 :(得分:1)
我和你有完全相同的问题。更奇怪的是,它发生在一些平板电脑4.0或4.1,而它没有发生在手机4.1上。 使用“descendentFocusabilty = blocksDescendants”并没有解决它。
按照user1603602的想法,每当View变为可见时,我都要求列表的视图失效(因此重新绘制列表的元素):
@Override
protected void onWindowVisibilityChanged(int visibility) {
super.onWindowVisibilityChanged(visibility);
if (visibility == View.VISIBLE) {
list.invalidateViews();
}
}
当它重新加载列表中的每个项目时,如果你加载带有动画的图像会很烦人,但它可以解决问题,并保持滚动位置。
答案 1 :(得分:0)
我遇到了同样的问题,并找到了解决问题的方法。删除列表视图,然后将其添加回来。这将强制视图刷新到原始工作状态。
例如,如果ListView lv
位于LinearLayout lout
lout.removeView(lv);
lout.addView(lv);
确保从UI线程中调用此方法。
答案 2 :(得分:0)
我认为这与描述here
的问题相同我使用了一个包含Views数组的自定义适配器。在getView(position,...)中,我返回指定位置的View。显然,ListView不喜欢这样,有时(特定于平台)回收不应回收的视图。