我正在解析一个Web服务以显示在由我自己的ArrayAdapter子类支持的listView中。数据为Application.java
中的static ArrayList<Wait>
。你会看到它参考App.getWaits()
。使用ArrayAdapter刷新ListView
我有一个简单的刷新方法,当有新的数据。我已经确认它正在更新,但它只会呈现,如果我离开,然后返回到视图。
在过去,我已经能够通过调用适配器上的notifyDataSetChanged()来刷新listView,但现在这些都没有为我工作。感谢您看看...任何想法!?
//1 This is how I'd normally update the listView dynamically, but not tonight.
adapter.notifyDataSetChanged();
//2 It's the same thing really, so no good.
((WaitAdapter) list.getAdapter()).notifyDataSetChanged();
//3 Saw this as the answer to a similar question, doesn't work.
adapter.getWaits().clear();
adapter.getWaits().addAll(App.getWaits());
adapter.notifyDataSetChanged();
//4 Called in onCreate but tried a 2nd time in refresh() to manually reset adapter, doesn't work.
adapter = new WaitAdapter(getHost().getApplicationContext(), App.getWaits());
list.setAdapter(adapter);
//5 Kinda the same thing, new adapter, reset adapter... also no good.
WaitAdapter adapter = new WaitAdapter(getHost().getApplicationContext(), App.getWaits());
list.setAdapter(adapter);
//6 I read ArrayAdapter keeps its own reference to initial data object but this fails too.
adapter = null;
adapter = new WaitAdapter(getHost().getApplicationContext(), App.getWaits());
list.setAdapter(adapter);
*更新以分享我的WaitAdapter.java
。
public class WaitAdapter extends ArrayAdapter<Wait> {
private LayoutInflater inflater;
private ArrayList<Wait> waits;
public WaitAdapter(Context context, ArrayList<Wait> data) {
super(context, R.layout.list_item_wait, data);
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
waits = data;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_item_wait, parent, false);
holder = new ViewHolder();
holder.checkpointName = (TextView) convertView.findViewById(R.id.checkpointName);
holder.delayAmount = (TextView) convertView.findViewById(R.id.delayAmount);
holder.timeReported = (TextView) convertView.findViewById(R.id.timeReported);
holder.dateReported = (TextView) convertView.findViewById(R.id.dateReported);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Wait wait = waits.get(position);
holder.checkpointName.setText(wait.getName());
holder.delayAmount.setText(wait.getDelayInMinutes());
holder.timeReported.setText(wait.getTimeLabel());
holder.dateReported.setText(wait.getDateLabel());
return convertView;
}
@Override
public boolean isEnabled(int position) {
return false;
}
static class ViewHolder {
TextView checkpointName;
TextView delayAmount;
TextView timeReported;
TextView dateReported;
}
}
12/14/14更新:一般实施背景。
启动时,App类启动WaitAsyncTask,它解析远程XML以填充其ArrayList等待。我会在几个地方访问这些等待,这样我就可以保持全局。
WaitFragment与WaitAdapter一起使用,在ListView中显示等待并侦听等待的更改。用户可以通过AlertDialog等待Web服务等待。一个成功的响应再次执行WaitAsyncTask,更新等待对象,触发WaitFragment刷新()。
控制台日志和Web服务确认此控制流,并且等待得到更新。如果我离开WaitFragment然后返回,它显示更新的等待。发布了评论#1-6的代码就是我在refresh()里面尝试更新ListView的内容。
我对这个应用程序中的其他数据和片段使用这种通用方法,它们的UI按预期刷新,但没有一个是listView。我不确定如果没有对其中的大部分内容进行编辑,我都可以发布更多源代码,但是一旦我开始工作,我会分享我的调查结果。我以前没有遇到过使用ListView的麻烦,但肯定会令人尴尬。谢谢大家谁花了一点时间:)
发布您的适配器! – mmlooloo 2014-12-13 06:44:13
这可能是因为你的ArrayList'waits'没有得到新数据的更新。 – Shvet 2014-12-13 07:19:59
您是否在任何时候过滤适配器? – 2014-12-13 12:02:44