2010-07-07 275 views
1

我有一個列表視圖,該視圖由從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]

+0

發佈自定義適配器的代碼,任務和刷新按鈕的onClick。 – 2010-07-07 02:17:17

+0

放入一些代碼。我被告知要調用notifydatasetchanged和notifydatanull或其他方法。但我沒有真正添加到數組然後重新填充,我想完全銷燬列表視圖並從頭開始重做 – Falmarri 2010-07-07 02:35:29

回答

0

錯誤是在創造我的選擇子菜單。我有

menu.addSubMenu(MENU_REFRESH,0,0, 「刷新」); isntead

menu.addSubMenu的

(0,MENU_REFRESH,0, 「刷新」);