我尝试更改Android中Listview的内容。之后我想重新绘制列表。不幸的是列表元素发生了变化,但旧项目在后台显示。如果新列表中的项目较少,则旧项目仍然是列表的一部分,因为它们仍然显示,即使它们不可点击。如果我通过Android Taskmanager跳出应用程序,然后再次打开应用程序,列表将正确显示! 因此我觉得刷新一定是个问题。
我如何尝试实现它:
随着完整内容的更改,我创建了一个新的适配器,并将其传递给ListView。在我的代码中,“favorites”是我传递给适配器的新数组。我也尝试清除列表并使其无效。所有这些都发生在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上尝试了所有类似问题的解决方案。遗憾的是没有任何效果......
提前感谢任何想法如何解决这个问题。
编辑:
我还尝试在传递新的适配器之前设置适配器null,也没有效果。 .setAdapter(NULL);
此外,如果我通过单击editText打开键盘,屏幕会刷新并且列表会正确显示。
答案 0 :(得分:2)
您是否尝试过myList.setAdapter(null);
?
答案 1 :(得分: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>
答案 2 :(得分:2)
我试过了,我发现清单文件中的应用程序标记中的HardwareAcceleration必须设置为TRUE(也是默认值)。否则,listView会在输入过程中将旧的不可点击项目保留在其背景中。
android:hardwareAccelerated="true"
答案 3 :(得分:1)
首先清除数据。我认为它是favorites
或items
或其他什么。并以这种方式通知适配器。
items.clear();
((MyAdapter) myList.getAdapter()).notifyDataSetChanged();
MyAdapter newAdapter = new MyAdapter(context, favorites);
myList.setAdapter(newAdapter);
myList.invalidate();