我得到了以下問題,希望有人能給我一個提示。android:在MainActivity的AsyncTask中使用arrayadapter <自定義對象>
我有執行一的AsyncTask <字符串,空隙的ArrayList <自定義對象>>的活性。 在doInBackground函數中,我設置了一個新的自定義對象的ArrayList,它也是返回值。 ! 在該ArrayList的是在新創建的ArrayAdapter,它也被設置爲一個ListView(與lv.setAdapter(適配器)使用的onPostExecute方法 到目前爲止好
現在的事情是:在MainActivity回我將再次需要該適配器,因爲我想通過調用adapter.add(items)來添加新的項目。 現在我有AsyncTask作爲我的MainActivity的內部類,並且可以使用相同的listview &相同的arrayadapter
但由於我有另一個需要執行AsyncTask的類,我將該內部類AsyncTask更改爲獨立的.java文件(CustomAsyncTask.java)
- >現在當我嘗試向ArrayAdapter添加新項目時,它會引發NullPointerException! 當然,這就是說,導致ArrayAdapter屬於AsyncTask並且在那裏創建 所以我試圖從MainActivity中提供ListView和ArrayAdapter作爲CustomAsyncTask構造函數的參數,以便在 中使用它,但那不起作用, MainActivity中的ArrayAdapter始終爲空導致異常
任何想法如何解決? 我真的很感激它。
這裏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的代碼: 包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);
}
}
}
謝謝..但沒有一種方法可以將值返回給MainActivity(不只是在onPostExecute())? - >'因爲它在AsyncTask是MainActivity的內部類時起作用,不知何故它應該如果它也是一個外部類,那該不該工作呢? – user1515520 2012-07-10 19:55:55
適配器最初是主要活動中的變量嗎?因爲內部類可以訪問外部類的實例變量......是的,它應該可以讓異步任務返回一個數組適配器;但是,對該返回值所做的任何更改都不會保留其他實例。 – Joel 2012-07-10 20:03:18
ArrayAdapter arrayadapter在MainActivity中全局定義(所以當Activity啓動適配器時爲null),然後創建一個新的AsyncTask對象,並將arrayadapter&listview作爲參數並執行它。我在CustomAsyncTask中使用arrayadapter填充listview,填充了一個數組列表。 (在onPostExecute()) 也來自MainActivity的listview被正確設置,只有當我嘗試調用arrayadapter.add(item)時,它會拋出一個NullPointerException – user1515520 2012-07-10 21:19:09