5

我尝试在 Android 中更改 Listview 的内容。之后,我希望重新绘制列表。不幸的是,列表元素发生了变化,但旧项目显示在后台。如果新列表中的项目较少,则旧项目似乎仍然是列表的一部分,因为它们仍然显示,即使它们不可点击。如果我通过 Android 任务管理器跳出应用程序,然后再次打开应用程序,列表将正确显示!因此,我认为这一定是刷新的问题。

我如何尝试实现它:

随着完整内容的更改,我创建了一个新适配器,并将其传递给 ListView。在我的代码中,“收藏夹”是我传递给适配器的新数组。我也尝试清除列表并使其无效。所有这些都发生在 UI 线程中(AsyncTask 的 onPostExecute)

    MyAdapter newAdapter = new MyAdapter(
            context, favorites);
    MyAdapter current_adapter = (MyAdapter) myList.getAdapter(); 
    if((current_adapter!=null)){
    current_adapter.clear();}

    myList.setAdapter(null); //inserted this because of answers, but with no effect.
    myList.setAdapter(newAdapter);
    myList.invalidateViews();

适配器的清除方法:

    public void clear(){
    items.clear();
    notifyDataSetChanged();
    }

如您所见,我在stackoverflow上尝试了所有类似问题的解决方案。不幸的是,没有任何工作......

提前感谢您提供解决此问题的任何想法。

编辑:

我还尝试在传递新适配器之前将适配器设置为空,但也没有效果。.setAdapter(null);

此外,如果我通过单击 editText 打开键盘,屏幕会刷新并且列表会正确显示。

4

4 回答 4

2

我通过使用layout_weight超过ListView. 这样,“额外”的行就被隐藏了。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/transparent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/main_list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>

    <LinearLayout
        android:id="@+id/aux_layout"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="@color/transparent"
        android:orientation="vertical" />

</LinearLayout>
于 2013-10-03T19:26:32.957 回答
2

你试过myList.setAdapter(null);吗?

于 2013-09-04T10:25:37.183 回答
2

我试过了,我发现必须在清单文件的应用程序标记中将 HardwareAcceleration 设置为 TRUE(这也是默认值)。否则 listView 将在键入过程中将旧的不可点击项目保留在其背景中。

android:hardwareAccelerated="true"
于 2017-02-14T11:37:37.190 回答
1

首先清除数据。我认为它是favoritesitems或什么的。并以这种方式通知适配器。

items.clear();
((MyAdapter) myList.getAdapter()).notifyDataSetChanged();
MyAdapter newAdapter = new MyAdapter(context, favorites);
myList.setAdapter(newAdapter);
myList.invalidate();
于 2013-09-04T10:28:25.360 回答