2014-12-03 1 views
0

androidplot 라이브러리를 사용하여 플롯 된 두 그래프의 Listview를 사용하고 있습니다. 새로운 수신 데이터가있을 때마다 listview를 지속적으로 업데이트하는 방법을 모르겠습니다.androidplot을 사용하여 그래프의 목록보기를 새로 고치는 방법

장치에서 연속적으로 임의의 데이터를받는 방법이 있습니다. 이 새로운 데이터로 두 그래프를 업데이트해야합니다. 아래에 나와있는 Array 어댑터에서 빌드 한 사용자 정의보기 어댑터를 사용합니다.

class MyViewAdapter extends ArrayAdapter<View> { 
    public MyViewAdapter(Context context, int resId, List<View> views) { 
     super(context, resId, views); 
    } 


    @Override 
    public int getCount() { 
     return 2; 
    } 

    @Override 
    public View getView(int pos, View convertView, ViewGroup parent) { 
     LayoutInflater inf = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     View v = convertView; 
     if (v == null) { 
      v = inf.inflate(R.layout.listview_example_item, parent, false); 
     } 

     p = (XYPlot) v.findViewById(R.id.xyplot); 

     Random generator = new Random(); 
     p.setTitle("plot" + pos); 

     for (int k = 0; k < NUM_SERIES_PER_PLOT; k++) { 

      double rl = Math.random(); 
      double gl = Math.random(); 
      double bl = Math.random(); 

      double rp = Math.random(); 
      double gp = Math.random(); 
      double bp = Math.random(); 
      if(setArrayValues != null){ 
      if(pos == 0) { 
       XYSeries series = new SimpleXYSeries(setArrayValues.getSeries1Numbers(), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "RPM"); 
       //XYSeries series = new SimpleXYSeries(nums, SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "RPM"); 
       p.addSeries(series, new LineAndPointFormatter(
         Color.rgb(new Double(rl * 255).intValue(), new Double(gl * 255).intValue(), new Double(bl * 255).intValue()), 
         Color.rgb(new Double(rp * 255).intValue(), new Double(gp * 255).intValue(), new Double(bp * 255).intValue()), 
         null, null)); 
      } 
      else{ 
       XYSeries series = new SimpleXYSeries(setArrayValues.getSeries2Numbers(), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "SPEED"); 
       //XYSeries series = new SimpleXYSeries(nums, SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "SPEED"); 
       p.addSeries(series, new LineAndPointFormatter(
         Color.rgb(new Double(rl * 255).intValue(), new Double(gl * 255).intValue(), new Double(bl * 255).intValue()), 
         Color.rgb(new Double(rp * 255).intValue(), new Double(gp * 255).intValue(), new Double(bp * 255).intValue()), 
         null, null)); 
      } 
     } 
     } 
     p.redraw(); 



     return v; 
    } 
} 

아래의 방법은 장치에서 데이터를 수신하고 관련 Arraylists를 업데이트합니다.

public void receivePackage() throws SocketException { 

    new Thread() { 

     byte[] packet = new byte[64]; 
     DatagramPacket data = new DatagramPacket(packet, 
       packet.length); 
     DatagramSocket socket = new DatagramSocket(null); 

     JSONObject json; 

     @Override 
     public void run() { 
      try { 
       isRunning = true; 
       socket.setReuseAddress(true); 
       socket.bind(new InetSocketAddress(50009)); 
      } catch (SocketException e1) { 
       e1.printStackTrace(); 
      } 
      try { 

       while (isRunning) { 

        socket.receive(data); 

        final String string = new String(
          data.getData(), 0, 
          data.getLength(), "UTF-8"); 

        json = new JSONObject(string); 

        runOnUiThread(new Runnable() { 

         @Override 
         public void run() { 
          try {         
           int wiper = json.getInt("wiper"); 
           int speed = json.getInt("speed"); 
           speed = speed + 2000; 

           setArrayValues.addValues(wiper,speed); 
           lv.invalidateViews(); 

          } catch (JSONException e) { 
           e.printStackTrace(); 
          } 
         } 
        }); 
       } 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      socket.close(); // keep this out of while 
     } 
    }.start(); 
} 

실제로 데이터 포인트를 그래프에 플로팅 할 수 없습니다. 나는 내가 선

XYSeries series = new SimpleXYSeries(setArrayValues.getSeries1Numbers(), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "RPM"); 

XYSeries series = new SimpleXYSeries(setArrayValues.getSeries2Numbers(), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "RPM"); 

에서 사용하지만 값이 그래프에 표시되지 않습니다 두 개의 서로 다른 ArrayLists에 값을 설정하는 별도의 헬퍼 클래스가

setArrayValues.addValues(wiper,speed); 

을 사용했다. 이 문제에 대한 해결책을 제시 할 수 있습니까?

+0

notifyDataSetChanged 메소드보기 -> http://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged() –

답변

0

notifyDatasetChanged는 보이는 뷰에 대해 getView를 다시 트리거합니다. 새 데이터를 설정하기 전에 그래프를 재설정해야합니다. 그것은 효율적이지 않을 것입니다. 그래프가 두 개인 경우 listView를 사용하는 이유는 무엇입니까? 선형 레이아웃이있는 ScrollView는 훨씬 쉽게 관리 할 수 ​​있습니다.

+0

그래프에 데이터 포인트를 표시하는 데 문제가 있습니다. 나는 그 질문을 편집했다. 좀 봐 주 시겠어요? – Shiva

0

코드를 모두 보지 않고도 다음 중 하나의 경우를 추측 할 수 있습니다.

1) setArrayValues를 초기화하지 않으므로 setArrayValues ​​== null이되므로 시리즈가 생성되지 않습니다.

2) 어댑터에서 notifyDataSetChanged를 호출하지 않습니다. 예를 들어 그래프를 반복적으로 업데이트하려면 어댑터에서 notifyDataSetChanged를 호출해야합니다. 이렇게하면 플롯을 생성하는 getView()에 대한 호출이 트리거됩니다.

문제는 표시 한 코드 외부에있는 것 같습니다. 뭔가 제대로하고 있지 않습니다. 어댑터를 실제로 설치했는지 알기가 어렵습니다. 예를 들어, 귀하의 코드를 설정하는 가장 쉬운 방법은 ArrayAdapter가 있고 notifyDataSetChanged를 호출하는 것입니다. lv.invalidateViews();를 사용하여 동일한 작업을 수행하려는 것처럼 보입니다. 여기서 lv는 ListView를 나타냅니다. 이 경우, 그게 문제가 ... 당신은 listView에 대한 어댑터의 종류가 필요하고, 당신은 하나가없는 것 같습니다. arrayAdapter를 설정 한 다음 lv.invalidateViews(); 대신에

을 사용하십시오.

myAdapter.notifyDataSetChanged();