2014-10-27 79 views
0

我做了一个演示,在其中显示来自webservice的数据。哪个工作正常。当我第一次启动服务时,我能够在listview上显示数据。但是我需要一次又一次地访问服务器并获取新数据。以获得新的数据。但我需要在列表视图中显示新数据,但是当我获得新数据时,列表变为空白或空白。为什么?如何在固定的时间间隔后重新列表listview?

这是我的代码。

protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.departure_dashboard); 
    Log.d("=========onCreate", "constructor"); 

    try { 
     Bundle bundle = getIntent().getExtras(); 
     String message = bundle.getString("Response"); 
     Log.d("=========onCreate", message); 
     listView=(ListView)findViewById(R.id.listView1); 
     data = new Gson().fromJson(message, deparaturedaseboarddto.class); 
     adapter = new CustomListAdapter(this, data.getData()); 

     listView.setAdapter(adapter); 
     timer =new Timer(); 
     timer.scheduleAtFixedRate(new alertTask(), 0, 4000); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

当定时器开始我用alerk task.and调用webservice的连连

public class alertTask extends TimerTask { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      WebserviceMethod callDepartudeDashboard=new WebserviceMethod(); 
      callDepartudeDashboard.setObserver(Departuredashboardscreen.this); 
      callDepartudeDashboard.getwebService(ConstantVariable.dashboardWebServiceURL+"a/"+"departuredashboard"+"?crsCode=hnh"); 


     } 

    } 

这是一次又一次的给予回应的方法...

@Override 
     public void getWebserviceResponse(String result) { 
      // TODO Auto-generated method stub 
      Log.d("timer", result); 
      data.getData().clear(); 


      deparaturedaseboarddto localData = new Gson().fromJson(result, deparaturedaseboarddto.class); 
      data=localData 
      adapter.notifySetDataChanged(); 

     } 

这里我的自定义适配器为列表视图

public class CustomListAdapter extends BaseAdapter{ 
    ArrayList<deparaturedaseboarddto> deparaturedaseboarddto; 
    private Context context; 
    public CustomListAdapter(Context context, ArrayList<deparaturedaseboarddto> deparaturedaseboarddto){ 
     this.deparaturedaseboarddto=deparaturedaseboarddto; 
     this.context = context; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return deparaturedaseboarddto.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return deparaturedaseboarddto.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     View v = convertView; 
      if (v == null) { 
       LayoutInflater mInflater = (LayoutInflater) context 
         .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       v = mInflater.inflate(R.layout.row_listitem, null); 
      } 

      final TextView platFormName = (TextView) v 
        .findViewById(R.id.item_platform); 

      final TextView schDepart = (TextView) v 
        .findViewById(R.id.item_schDepart); 
      final TextView expDepart = (TextView) v 
        .findViewById(R.id.item_expectdepart); 
      final TextView arrival = (TextView) v 
        .findViewById(R.id.item_arrival); 
      final TextView exparrival = (TextView) v 
        .findViewById(R.id.item_expertarrival); 
      final TextView stationName = (TextView) v 
        .findViewById(R.id.item_stationName); 

      final String platformValue = deparaturedaseboarddto.get(position).getPlatformNo(); 
      final String schDepartValue= deparaturedaseboarddto.get(position).getSchDepart(); 
      final String schExpectValue= deparaturedaseboarddto.get(position).getExpDepart(); 
      final String arrivalValue= deparaturedaseboarddto.get(position).getDestSchArrival(); 
      final String exparrivalValue= deparaturedaseboarddto.get(position).getDestSchArrival(); 
      String stationNameValue= deparaturedaseboarddto.get(position).getDestinationStation().getStationName(); 

      platFormName.setText(platformValue); 

      schDepart.setText(schDepartValue); 
      expDepart.setText(schExpectValue); 
      arrival.setText(arrivalValue); 
      exparrival.setText(exparrivalValue); 
      stationName.setText(stationNameValue); 
      return v; 
    } 

    public void notifySetDataChanged() { 
     // TODO Auto-generated method stub 
     notifyDataSetChanged(); 
    } 

} 
+0

做yu从同一个类打web服务吗?先生 – Elltz 2014-10-27 01:41:06

回答

2

这是因为你的适配器仍抱着旧的参考,当你调用data.getData().clear();

要澄清一下,当你第一次创建您的适配器被清空的数据集,

adapter = new CustomListAdapter(this, data.getData()); 

你传入一个ArrayList, data.getData()到你的适配器,那就是你的适配器将从中读取数据的ArrayList。

现在,当您收到新数据时,您将数据指向localData,但您的适配器不知道这一点。的

@Override 
public void getWebserviceResponse(String result) { 
    // TODO Auto-generated method stub 
    Log.d("timer", result); 
    data.getData().clear(); 
    deparaturedaseboarddto localData = new Gson().fromJson(result,deparaturedaseboarddto.class); 
    data=localData; 
    adapter.notifySetDataChanged(); 
} 

所以与其做data = localData;,你应该做的data.addAll(localData.getData());然后调用notifyDataSetChanged();

基本上你想使用一个单独的ArrayList,只是不断从它中删除数据并向它添加新的数据。

相关问题