我有一個列表視圖,該視圖由從Web服務器獲取其數據的行填充。除了我希望有一個刷新按鈕來重新下載數據外,它全部正常工作。我通過asynctask(在doinbackground中獲取數據)獲取數據,然後在onpostexecute中設置listadapter。我所做的只是運行應該照顧一切的asynctask運行刷新列表視圖
new PopulateListTask()。execute();
但是,在我的optionsSelect方法中,創建一個新的asynctask就像我在oncreate中做的一樣,不會做任何事情。它甚至不會進入doInBackground。我試過使用listView.invalidate()和listView.invalidateViews()。是否有一些特殊的方式可以重新填充listview?
我唯一的猜測是,因爲我使用的是自定義適配器,所以我的getView方法正在創建某種錯誤,但這並不能解釋爲什麼它甚至沒有進入我的asynctask的doInBackground方法。思考?
編輯:張貼一些代碼。這是一個修剪版本。
`
private class PopulateListTask extends AsyncTask<Void, Void, ArrayList<Quote>>{
@Override
protected ArrayList<Quote> doInBackground(Void... params) {
quotes = Helper.getQuotes();
return quotes;
}
@Override
protected void onPostExecute(ArrayList<Quote> quotes){
setListAdapter(new QuoteAdapter(ctx,R.layout.quote_row,quotes));
}
}
private class QuoteAdapter extends ArrayAdapter<Quote>{
ArrayList<Quote> items;
int resource;
public QuoteAdapter(Context context, int textViewResourceId, ArrayList<Quote> items){
super(context, textViewResourceId, items);
this.items = items;
this.resource = textViewResourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent){
View v = convertView;
LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(resource,null);
// do stuff with v
return v;
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case(MENU_REFRESH):
new PopulateListTask().execute();
}
`
好希望這個作品,對不起,我還沒有完全確定的最佳方式輸入代碼。
EDIT2:
執行我的AsyncTask的第二次時,我得到這個在我的logcat中。任何想法是什麼意思?我嘗試了谷歌搜索無濟於事。
W/InputManagerService(52):窗口已經集中,忽視聚焦增益的:[email protected]
發佈自定義適配器的代碼,任務和刷新按鈕的onClick。 – 2010-07-07 02:17:17
放入一些代碼。我被告知要調用notifydatasetchanged和notifydatanull或其他方法。但我沒有真正添加到數組然後重新填充,我想完全銷燬列表視圖並從頭開始重做 – Falmarri 2010-07-07 02:35:29