0

サーバーと通信する Futuretask スレッドに応じて、arraylistを動的に設定/削除するアプリケーションを構築しています。

問題は、新しいオブジェクトをarrayadapterに追加し、何らかの方法でnotifyDataSetChangedまたはsetNotifyOnChangeを呼び出すときです

(たとえば、アイテムを追加した後、notifyDataSetChanged を呼び出す postadd 関数を作成しようとしたり、アダプター コンストラクターに setNotifyOnChange を追加しようとしたり、(adapter.setNotifyOnChange(true)) を追加する前に)

この Futuretask では、単にスレッドをフリーズさせ、アプリケーションの誤動作を引き起こします。ArrayAdapter の getView() を呼び出すために指でスライドするとき、notifyonchange がなければ機能しますが、これは望ましくない動作です。

注: 静的変数参照によってアダプターにアクセスしています。

注#2:新しいアダプターを何度も作成することは賢明な選択だとは思いません。

/編集:

私の削除方法は次のようになります。

public void remove (int itemid) {
        for (ContactItem i : items)
            if (i.ID == itemid)
                items.remove(i);
    }

(そして、最後のファランテシスで最後にぶら下がっています)

4

2 に答える 2

1
  1. コンテキストを漏らさないように、他のスレッドのアクティビティへの弱い参照を渡します。

        WeakReference<Activity> mRef_Activity = new WeakReference<Activity>(activity);
    
  2. そのスレッドから、メイン アクティビティの UI スレッドで通知更新を実行します。

        final Activity activity = mRef_Activity.get();
        if(activity != null)
            activity.runOnUiThread(new Runnable() {
    
                @Override
                public void run() {
    
                    ArrayAdapter<String>  adapter = activity.getAdapter();
                    adapter.notifyDataSetChanged();
    
                }
            });
    

callable または runnable の代わりに非同期タスクを実行している場合は、メイン UI スレッドからのコールバックであるため、非同期の postExecute に通知更新を配置するだけでよいことに注意してください。

于 2014-11-04T00:11:46.363 に答える