Как правильно обновить объект GraphView в Fragment (GraphView не обновляется с поступающими данными) - PullRequest
1 голос
/ 23 апреля 2019

Я работаю над проектом, в котором я собираю 4 категории данных датчиков с помощью Bluetooth с низким энергопотреблением и отображаю эти данные в виде вкладок с пролистыванием в отдельных фрагментах. В настоящее время у меня полностью работает функциональность BLE, и я получаю значения, как и ожидалось. Однако после реализации класса Fragment, класса FragmentPagerAdapter и MainActivity мои графики не обновляются при поступлении данных.

В настоящее время у меня возникают проблемы с определением, правильно ли я ссылаюсь на фрагмент или неправильно реализовал функциональность GraphView. Я пытался ссылаться на документацию GraphView безрезультатно. Кроме того, TextView внутри фрагмента обновляется, как и ожидалось, просто GraphView никогда не рисует никаких данных.

Класс DemoFragment:

public class DemoFragment extends Fragment {
    private TextView textView;
    private LineGraphSeries<DataPoint> series;
    private GraphView graph;

    private int position;

    //UpdateSessionData updateIt;

    /*public DemoFragment() {
        // Required empty public constructor
    }*/

    public static DemoFragment newInstance(int pos){
        Bundle args = new Bundle();
        args.putInt("position", pos);
        DemoFragment fragment = new DemoFragment();
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        position = getArguments().getInt("position");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_demo, container, false);
        return view;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState){
        super.onViewCreated(view, savedInstanceState);
        graph = (GraphView) view.findViewById(R.id.graph);
        textView = view.findViewById(R.id.classification_txt);

        graph.getViewport().setScalable(true);
        graph.getViewport().setScalableY(true);
        graph.getViewport().setScrollable(true);
        graph.getViewport().setScrollableY(true);

        graph.getViewport().setYAxisBoundsManual(true);
        graph.getViewport().setMaxY(4095);
        graph.getViewport().setMinY(0);
        graph.getViewport().setXAxisBoundsManual(true);
        graph.getViewport().setMaxX(100);
        graph.getViewport().setMinX(0);

        series = new LineGraphSeries<DataPoint>();
        graph.addSeries(series);

        textView.setText("Classification: " + position);
    }

    public void addDataPoint(DataPoint point){
        series.appendData(point, true, 10000);
        graph.refreshDrawableState();
    }

    /*interface UpdateSessionData{
        void updateFragment(int x, int y);
    }*/
}

Класс ViewPagerAdapter:

public class ViewPagerAdapter extends FragmentPagerAdapter {

    private String tabTitles[] = new String[] { "O2", "GSR", "HR", "EMG"};

    public ViewPagerAdapter(FragmentManager fm){
        super(fm);
    }

    @Override
    public Fragment getItem(int position){
        return DemoFragment.newInstance(position + 1);
    }

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

    @Nullable
    @Override
    public CharSequence getPageTitle(int position){
        return tabTitles[position];
    }
}

Соответствующий код MainActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    o2frag = DemoFragment.newInstance(0);
    ft.add(R.id.pager, o2frag, "o2");
    gsrFrag = DemoFragment.newInstance(1);
    ft.add(R.id.pager, gsrFrag, "gsr");
    hrFrag = DemoFragment.newInstance(2);
    ft.add(R.id.pager, hrFrag, "hr");
    emgFrag = DemoFragment.newInstance(3);
    ft.add(R.id.pager, emgFrag, "emg");
    ft.show(emgFrag);
    ft.commit();

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                displayFragment(position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

    protected void displayFragment(int fragPosition){
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        DemoFragment fragment = (DemoFragment) adapter.getItem(fragPosition);
        ft.show(fragment);
        ft.commit();

}

    @Override
        public void onCharacteristicWriteRequest(BluetoothDevice device,
                                                 int requestId,
                                                 BluetoothGattCharacteristic characteristic,
                                                 boolean preparedWrite,
                                                 boolean responseNeeded,
                                                 int offset,
                                                 final byte[] value) {
            super.onCharacteristicWriteRequest(device, requestId, characteristic, preparedWrite, responseNeeded, offset, value);
            Log.i(TAG, "onCharacteristicWriteRequest "+characteristic.getUuid().toString());

            if (UARTProfile.RX_WRITE_CHAR.equals(characteristic.getUuid())) {

                //IMP: Copy the received value to storage
                storage = value;
                if (responseNeeded) {
                    mGattServer.sendResponse(device,
                            requestId,
                            BluetoothGatt.GATT_SUCCESS,
                            0,
                            value);
                    Log.d(TAG, "Received  data on "+characteristic.getUuid().toString());
                    Log.d(TAG, "Received data "+ bytesToHex(value));

                }

                //IMP: Respond
                sendOurResponse();

                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        //Toast.makeText(LoginActivity.this, "We received data", Toast.LENGTH_SHORT).show();
                        //Toast.makeText(SessionActivity.this, "We received data: " + bytesToHex(value), Toast.LENGTH_SHORT).show();

                        short [] dataArray = byteArrayToShortArray(value);
                        Toast.makeText(SwipeDataActivity.this, "We received data: " + Arrays.toString(dataArray), Toast.LENGTH_SHORT).show();
                        currentTime = SystemClock.elapsedRealtime();
                        long elapsedTime = currentTime - startTime;
                        DataPoint [] points = new DataPoint[4];
                        for(int i = 0; i < dataArray.length; i++){
                            points[i] = new DataPoint(currentTime, (long) dataArray[i]);
                        }
                        o2frag.addDataPoint(points[0]);
                        gsrFrag.addDataPoint(points[1]);
                        hrFrag.addDataPoint(points[2]);
                        emgFrag.addDataPoint(points[3]);
                    }
                });
            }
        }

Буду очень признателен за помощь в понимании того, почему GraphView не обновляется! Заранее спасибо за ваше время, извините за большие блоки кода, но я хотел убедиться, что соответствующая информация была доступна.

...