【发布时间】:2014-12-13 06:28:22
【问题描述】:
我正在解析一个 Web 服务以显示在我自己的 ArrayAdapter 子类支持的 listView 中。数据为static ArrayList<Wait> 中的Application.java。你会看到它被App.getWaits()引用。
当有新数据时,我使用一种简单的刷新方法。我已经确认它正在更新,但只有在我离开然后返回视图时才会呈现。
过去,我可以通过在适配器上调用 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 refresh()。
控制台日志和 Web 服务确认此控制流程并等待更新。如果我离开 WaitFragment 然后返回,它会显示更新的等待。使用 cmets #1-6 发布的代码是我在 refresh() 中尝试更新 ListView 的代码。
我将此通用方法用于此应用程序中的其他数据和片段,并且它们的 UI 按预期刷新,但没有一个是 listViews。我不确定我是否可以在不编辑大部分内容的情况下发布更多资源,但是一旦我开始工作,我会分享我的发现。我以前没有遇到过 ListView 的问题,但肯定会很尴尬。感谢所有花一点时间的人:)
【问题讨论】:
-
可能是您的数组列表
waits没有得到新数据的更新。 -
您是否随时过滤适配器?
-
@DhavalGondaliya 我可以通过控制台日志确认 arrayList 正在更新。
-
@JaySoyer 适配器未以任何方式过滤。
-
您能否发布更多代码来显示这些刷新
ListView的方法被调用的位置?发生了一些事情,但我们需要更多代码来帮助弄清楚是什么。
标签: java android listview adapter android-arrayadapter