1

次の問題が発生しました。誰かが私にヒントを与えてくれることを願っています。

を実行するアクティビティがありAsyncTask< String, Void, ArrayList<Custom object >>ます。関数では、戻り値でもあるdoInBackground()新しいカスタム オブジェクトを設定します。新しく作成された で使用されるArrayList方法onPostExecute()で、これまでのと同様に設定されてい ます。ArrayListArrayAdapter<Custom object>ListViewlv.setAdapter(adapter).

ここで重要なことは、MainActivity に戻ってそのアダプターが再び必要になることです。今のところ呼び出して新しいアイテムを追加したいので、MainActivity の内部クラスとしてadapter.add(items). を持っていて、非常にうまく機能した同じものを使用できました!AsyncTaskListViewArrayAdapter,

しかし、それを実行する必要がある別のクラスがあるためAsyncTask、その内部クラスAsyncTaskをスタンドアロン.javaファイル ( CustomAsyncTask.java)に変更しました。

-> 新しいアイテムを に追加しようとすると 、もちろんArrayAdapterスローされます。つまり、 が に属し、そこに作成されるため、 MainActivity から と をコンストラクターのパラメーターとして使用して使用しようとしましたそこにはありましたが、それは機能しませんでした.in MainActivityは常にnullであり、例外が発生しますNullPointerException!ArrayAdapterAsyncTaskListViewArrayAdapterCustomAsyncTaskArrayAdapter

それを解決する方法はありますか?とても感謝しております。

MainActivity.java のコードは次のとおりです。

// global variables
ArrayAdapter<Custom object> arrayadapter;
ListView listview;
ProgressBar progressbar;

...

protected void myMethod() {
    CustomAsyncTask hTask = new CustomAsyncTask(this, listview, progressbar, arrayadapter);
    hTaskPlaylist.execute(String sth);
}

...

protected void anotherMethod() {
    arrayadapter.add(item);
}

および CustomAsyncTask.java のコード:

package com.mypackage.test;

import java.util.ArrayList;

import android.content.Context;
import android.os.AsyncTask;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;

public class CustomAsyncTask extends AsyncTask<String, Void, ArrayList<Custom object>>{

    Context context;
    ListView listview;
    ProgressBar progressbar;
    ArrayAdapter<Custom object> arrayadapter;

    public CustomAsyncTask(Context con, ListView lv, ProgressBar pb, ArrayAdapter<Custom object> aa) {
        this.context = con;
        this.listview = lv;
        this.progressbar = pb;
        this.arrayadapter = aa;
    }

    @Override
    protected void onPreExecute() {
        listview.setVisibility(ListView.GONE);
        progressbar.setVisibility(ProgressBar.VISIBLE);
        super.onPreExecute();
    }

    @Override
    protected ArrayList<Custom object> doInBackground(String... params) {
            ArrayList<Custom object> list = new ArrayList<Custom object>();

            ... doing something and populating list
            return list;
    }

    @Override
    protected void onPostExecute(ArrayList<Custom object> list) {
        super.onPostExecute(list);

        arrayadapter = new ArrayAdapter<Custom object>(context, android.R.layout.simple_list_item_1, list);
        listview.setAdapter(arrayadapter);

        progressbar.setVisibility(ProgressBar.GONE);
                listview.setVisibility(ListView.VISIBLE);
    }

    }
}
4

2 に答える 2

1

ArrayAdapterを静的にすることができます。その後、アクセスしたいときはいつでも、CustomAsyncTask.arrayadapter.add(items);と言うことができます。カスタム非同期タスククラスに独自の関数を追加することもできます。public ArrayAdapter <> getAdapter()のようなものを作成できます。ただし、注意してください。複数のスレッドがそのオブジェクトにアクセス/変更することに関係なく、アクセスを同期することをお勧めします。

あなたはこのようなことを試すことができます...

ArrayAdapter globalAdapter;
globalAdapter = new CustomAsyncTask().execute(/*your parameters here*/).get();
于 2012-07-10T17:18:09.777 に答える
0

今私はそれを試し、MainActivityの代わりに をパラメーターとして渡しましたContext。変更したのは次のとおりです。

public class CustomAsyncTask extends AsyncTask<String, Void, ArrayList<Custom object>>{

    **MainActivity activity**;
    ListView listview;
    ProgressBar progressbar;
    ArrayAdapter<Custom object> arrayadapter;

    public CustomAsyncTask(**MainActivity act**, ListView lv, ProgressBar pb, ArrayAdapter<Custom object> aa) {
        **this.activity = act;**
        this.listview = lv;
        this.progressbar = pb;
        this.arrayadapter = aa;
    }

    ...

    @Override
    protected void onPostExecute(ArrayList<Custom object> list) {
        super.onPostExecute(list);

        arrayadapter = new ArrayAdapter<Custom object>(context, android.R.layout.simple_list_item_1, list);
        listview.setAdapter(arrayadapter);
        **activity.arrayadapter = arrayadapter;**

        progressbar.setVisibility(ProgressBar.GONE);
        listview.setVisibility(ListView.VISIBLE);
    }

}

うん、うまくいった!JoelさんlistviewMainActivityありがとう。AsyncTaskMainActivity

Activityそして別の質問:オブジェクトの代わりにオブジェクトを渡すことの唯一の違いは、Contextあなたが定義した利用可能な変数とメソッドにアクセスできるということですActivityか?

于 2012-07-11T09:45:17.263 に答える