【问题标题】:Refresh ListView with ArrayAdapter使用 ArrayAdapter 刷新 ListView
【发布时间】: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


【解决方案1】:

只需在 Adapter 类中创建一个方法来更新/刷新列表视图,如下所示,

  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;
    }   

       /**
        * Update content
        */
        public void updateListContent(ArrayList<Wait> data)
        {
        waits = data;
        notifyDataSetChanged();
        }
     }

在您的活动类中,只需调用此适配器方法即可更新内容。参考以下代码

注意:不要清除适配器的数组内容。

  //Dont clear the arraylist of adapter
  adapter.updateListContent(App.getWaits());

这可能会对你有所帮助。

【讨论】:

  • 这并没有帮助,但我很感激你的看法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
相关资源
最近更新 更多