Как обновить вид списка графиков с динамическими данными с помощью androidplot

Я использую 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();
}

На самом деле я не могу построить данные точек на графике. я использовал

setArrayValues.addValues(wiper,speed);

У меня есть отдельный вспомогательный класс, который устанавливает значения двух разных ArrayLists, которые я использую в строке

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

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

Но значения не отображаются на графике. Можете ли вы предложить какое-либо решение для этого.

2 ответа

NotifyDatasetChanged перезапустит getView для ваших видимых представлений. Будьте осторожны, что вам придется сбросить графики, прежде чем устанавливать новые данные. Это не будет эффективным, хотя. Почему вы используете listView, если у вас есть только два графика? ScrollView с линейным расположением будет намного проще в управлении.

Не видя весь ваш код, я бы предположил, что один из следующих случаев.

1) Вы никогда не инициализируете setArrayValues, так что setArrayValues ​​== null, и, следовательно, ряды никогда не создаются.

2) Вы не вызываете notifyDataSetChanged на вашем адаптере. Например, если вы хотите, чтобы графики периодически обновлялись, вам нужно вызвать notifyDataSetChanged на вашем адаптере, что вызовет вызов getView(), где вы создаете графики.

Кажется, что проблема не в том коде, который вы отобразили. Что-то не делается должным образом. Трудно даже сказать, если вы на самом деле настроили адаптер. Например, кажется, что самый простой способ настроить ваш код - это иметь ArrayAdapter, а затем вызвать notifyDataSetChanged. Похоже, что вы пытаетесь сделать то же самое с помощью lv.invalidateViews(); где я предполагаю, что lv означает ListView. Если это так, то это проблема... Вам нужно иметь какой-то тип адаптера для listView, и, похоже, у вас его нет. Попробуйте настроить arrayAdapter, затем вместо lv.invalidateViews();, используйте

myAdapter.notifyDataSetChanged();

Другие вопросы по тегам