0

私はAsyncTaskバックグラウンド作業を行っておりListView、その中にデータを入力してアダプターonProgressUpdateを呼び出しています。notifyDataSetChanged()問題は、向きが変わるとAsyncTask止まるということです。どうすればAsyncTaskその仕事を続け、ListView何があっても結果を入力し続けることができますか?android:configChanges="keyboardHidden|orientation"横向きモードではレイアウトが違うので使えません。またService、クラスを使用してみましたが、UIコンポーネントにアクセスできませんでした。私が求めていることを達成するための最も簡単な方法は何ですか?

4

1 に答える 1

1

コールバックメソッドを使用してlistViewを更新できます。AsyncTaskに実装し、doInBackgroundまたはonProgressUpdateから直接呼び出す必要があります。

private updateListViewListener mListener;


public interface updateListViewListener{
    void updateListView(List<String> rowsData);     
}

public void setUpdateListViewListener(updateListViewListener listener) {
    mListener = listener;
}

そして、doInBackGround(またはonPogressUpdate)で:

@Override
    protected Object doInBackground(Object... arg0) {
    //Code that downloads data or executes time consumming code that calls the following interface when the data of a row is ready
     mListener.updateListView(listOfStrings); 
}

次に、アクティビティで、AsyncTaskの参照を別のクラスに保存できます。

RandomClass.saveAsyncTask(yourAsynctask);

このようにして、アクティビティが再作成された場合でも、oncreateView()に次のようなものを追加して、AsyncTaskへの参照を取得できます。

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        YourAsyncTask task = RandomClass.getAsyncTask();
        if(task != null){
            newAsyncTask =  task;
            newAsyncTask .setUpdateListViewListener(this); // you set again the listener
        }
    }

そして最後に、これをアクティビティでオーバーライドするupdateListViewメソッドに追加できます。

@Override
    public void updateListView(List<String> newDataFromAT) {
        adapter.setData(newDataFromAT);
            // You need to do this since you can't change anything in the UI from doInBakcground
        getActivity().runOnUiThread(new Runnable() {
                public void run() {
          adapter.notifyDataSetChanged();
                }
            });
    }

これは、コードを投稿していないのでうまくいくと思うコードですが、デバイスを回転させると、AsyncTaskはlistViewのように破壊されたものを更新できないため、保持することをお勧めします。 asyncTaskへの参照。

于 2012-12-20T01:45:35.267 に答える