2014-12-13 171 views
0

我正在解析一个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的麻烦,但肯定会令人尴尬。谢谢大家谁花了一点时间:)

+1

发布您的适配器! – mmlooloo 2014-12-13 06:44:13

+0

这可能是因为你的ArrayList'waits'没有得到新数据的更新。 – Shvet 2014-12-13 07:19:59

+0

您是否在任何时候过滤适配器? – 2014-12-13 12:02:44

回答

0

刚刚创建适配器类更新/刷新列表视图如下的方法,

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

在你acivity类,只需要调用该适配器方法来更新内容。请参阅以下代码

注意:不要清除适配器的阵列内容。

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

这可能对您有所帮助。

+0

这没有帮助,但我感谢你的承担。 – es0329 2014-12-13 16:06:48