2010-07-07 265 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, “刷新”);