我有一个listview,它由从Web服务器获取数据的行填充。这一切都很好,除了我想有一个刷新按钮重新下载数据。我通过asynctask获取数据(在doinbackground中获取数据),然后在onpostexecute中设置listadapter。我所做的只是运行asynctask,它应该处理所有事情
new PopulateListTask()。execute();
但是,在我的optionsSelect方法中,就像我在oncreate中所做的那样创建一个新的asynctask并没有做任何事情。它甚至没有输入doInBackground。我已经尝试使用listView.invalidate()和listView.invalidateViews()。是否有一些特殊方式我应该重新填充列表视图?
我唯一的猜测是,因为我正在使用自定义适配器,我的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):窗口已经聚焦,忽略焦点增益:com.android.internal.view.IInputMethodClient$Stub$Proxy@43b9dee8
答案 0 :(得分:0)
错误在于创建我的选项subMenu。我有
menu.addSubMenu(MENU_REFRESH,0,0,“刷新”);
不是
menu.addSubMenu(0,MENU_REFRESH,0,“刷新”);