2013-09-04 10 views
5

AndroidでListviewのコンテンツを変更しようとしました。その後、リストを再描画します。残念ながらリストの要素は変わりますが、古い項目はバックグラウンドで表示されます。新しいリストに含まれるアイテムが少なくなると、古いアイテムはまだクリック可能であるにもかかわらず、まだ表示されているので、リストの一部であるように見えます。 Android Taskmanagerを使用してアプリから飛び出してから、アプリをもう一度開くと、リストが正しく表示されます。 したがって、私はそれがリフレッシュの問題でなければならないと思う。Android Listviewはアダプタの変更後に古いアイテムを保持します

私はListViewコントロールに渡す新しいアダプタを作成し、完全なコンテンツが変化すると:私はそれを達成しようとするにはどうすればよい

。私のコードでは、「お気に入り」はアダプタに渡す新しい配列です。私はまた、リストをクリアしてそれを無効にしようとします。これのすべては(AsyncTaskのonPostExecute)UIスレッドで発生

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(); 

アダプターの明確な方法:あなたが、私はstackoverflowの上で同様の問題に彼女をすべてのソリューションを試してみました見ることができるように

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

。残念ながら何も働いていませんでした。

これを解決する方法はありません。

編集:

は、私はまた、効果なしで、新しいものを渡す前に、アダプタはnullを設定することを試みました。 .setAdapter(null);

また、editTextをクリックしてキーボードを開くと、画面がリフレッシュされ、リストが正しく表示されます。

答えて

2

myList.setAdapter(null);を試しましたか?

+1

私はこれを試しましたが、残念ながら効果はありません。 – AndroidDev23

+0

それは最終的に解決策でしたか?私にとってはうまくいかず、同じ問題があります。 – mikus

1

最初にデータを消去します。私はそれがfavoritesまたはitemsまたは何でもそうだと思う。この方法でアダプタに通知します。

items.clear(); 
((MyAdapter) myList.getAdapter()).notifyDataSetChanged(); 
MyAdapter newAdapter = new MyAdapter(context, favorites); 
myList.setAdapter(newAdapter); 
myList.invalidate(); 
+0

私はすでにこれを行っていますが、効果はありません。 – AndroidDev23

1

IはListViewよりlayout_weight複数有するレイアウトでリストの下に残りの空間を充填することにより問題を解決しました。このようにして、「余分な」線が隠されます。

<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> 
+0

これは完全に私のために働いた、それはコントロールが縮小した後、Androidが適切に 'ゴミ箱'をクリーニングしていないようだ。だから、それには何があっても、それ以外のもので覆われるまでそこに残ります。エキスパンドコンテナが仕事をする – mikus

0

私はこれを試みましたが、マニフェストファイルのapplicationタグでHardwareAccelerationをTRUE(デフォルト値)に設定する必要があることが判明しました。それ以外の場合、listViewはタイピング中に背景にある古いクリック不可アイテムを保持します。

android:hardwareAccelerated="true" 
関連する問題