почему функция работает только в методе onCreate(), хотя должна работать везде где её вызовут?

299
01 ноября 2017, 01:05

Использую библиотеку GraphView для построения графика, для обновления данных построения используется функция series.resetData(getDataPoint()); но по каким то причинам она срабатывает только в методе onCreate. Я же хочу обновлять график каждый раз после выхода активности из паузы, соответственно нужно выполнять функцию в методе onResume, но series.resetData(getDataPoint()); не выполняется вообще нигде кроме onCreate.

public class MainActivity extends AppCompatActivity
{
    Cursor cursor;
    Cursor cursorMaxY;
    DataBase db;
    GraphView graph;
    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM");
    private LineGraphSeries<DataPoint> series;
    double maxy;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        graph = (GraphView) findViewById(R.id.graph);
        series = new LineGraphSeries<>(new DataPoint[0]);
        graph.addSeries(series);
        db = new DataBase(this);
        db.open();
        cursor = db.getAllData();
        startManagingCursor(cursor);
        cursorMaxY = db.getMaxY();
        startManagingCursor(cursorMaxY);
        cursorMaxY.moveToFirst();
        maxy = cursorMaxY.getInt(0);
        //series.resetData(getDataPoint());
        graph.getGridLabelRenderer().setLabelFormatter(new 
    DefaultLabelFormatter() //тут настраиваем форматирование 
        {
            @Override
            public String formatLabel(double value, boolean isValueX)
            {
                if (isValueX)
                {
                    return sdf.format(new Date((long) value));
                } else
                {
                    return super.formatLabel(value, isValueX);
                }
            }
        });
    private DataPoint[] getDataPoint() // тут получаем данные для построения графика из БД
    {
        cursor = db.getAllData();
        DataPoint[] dp = new DataPoint[cursor.getCount()];
        for (int i = 0; i < cursor.getCount(); i++)
        {
            cursor.moveToNext();
            dp[i] = new DataPoint(cursor.getFloat(3), cursor.getInt(2));
        }
        return dp;
    }
    @Override
    protected void onResume()
    {
        series.resetData(getDataPoint());
        super.onResume();
        Toast toast = Toast.makeText(getApplicationContext(),
                "это работает", Toast.LENGTH_SHORT);
        toast.show();
    }
}

P.S. onResume срабатывает корректно и выдает всплывающее сообщение, но series.resetData(getDataPoint()); не срабатывает

Буду рад любой помощи, спасибо!

Answer 1

Надо вызвать что-то типа такого:

series.resetData(getDataPoint());  //обновить данные
graph = (GraphView) findViewById(R.id.graph); //вьюшка где у вас что-то рисуется
graph.invalidate(); //дернуть/сообщить вьюшке, что данные изменились

Предупреждаю, что может не сработать invalidate() с предупреждением, что у вас попытка вмешаться из другого потока, поэтому возможно потребуется обернуть его в runOnUiThread() или вызвать postInvalidate() - в общем надо экспериментировать - зависит от места где вы это вызываете.

READ ALSO
Как скопировать строки из DataGridView?

Как скопировать строки из DataGridView?

Создаю другой DataGridView, скопировал массив строк из одного, хочу добавить в другойОшибка, надо чтобы столбцы совпадали

539
WPF TextBlock Binding

WPF TextBlock Binding

Помогите разобраться, не понимаю как отладить код или почему он не работает

366
Помощь с базами данных

Помощь с базами данных

При создании локальной базы данных в Visual Studio происходит ошибка при загрузке конструктора таблицПишет: Ошибка при загрузке

533
как правильно сделать Basic авторизацию? C#, xNet

как правильно сделать Basic авторизацию? C#, xNet

Для выполнения запроса требуется basic авторизацияЗапросы к серверу осуществляются по протоколу HTTPS методом POST

338