StickyHeader RecyclerView с линейным графиком Android

Я пытаюсь нарисовать график в виде липкого списка. Я запускаю asycntask в bindview следующим образом. При прокрутке асинхронная задача выполняется снова и снова, а графика отрисовывается наполовину. Как сохранить линейные графики и предотвратить их повторное рисование и как я могу сделать это разумно?

    @Override
public void bindView(StickyHeaderViewAdapter stickyHeaderViewAdapter, final StepsItemViewBinder.ViewHolder viewHolder, int i, StepsItemListModels stepsItemListModels) {
    viewHolder.txtDay.setText(stepsItemListModels.getTxtDay());
    viewHolder.txtDate.setText(stepsItemListModels.getTxtDate());
    viewholder= viewHolder;
    Thread t= new Thread(){
        @Override
        public void run() {
            super.run();
            imgwidth= viewHolder.imgChartView.getWidth();
            imgheight= viewHolder.imgChartView.getHeight();

            viewHolder.imgChartView.getGlobalVisibleRect(rect);
            globalImg=viewHolder.imgChartView;
        }
    };
    t.start();

          backgroundTask = new BackgroundTask();
          backgroundTask.execute();

}

BackgroundTask следующим образом:

public class BackgroundTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
    super.onPreExecute();
}

@Override
protected Void doInBackground(Void... params) {

    if(rect.height() >0 && rect.width() >0) {
        canvas = new Canvas();
        mPaint = new Paint();
        canvas.drawRect(rect, mPaint);
        centreY= rect.centerY();
        canvasBitmap = Bitmap.createBitmap(rect.width(), rect.height(), Bitmap.Config.ARGB_8888);
        canvas.setBitmap(canvasBitmap);
        mPaint.setStrokeWidth(5);
        canvas.drawBitmap(canvasBitmap, 0, 0, mPaint);


        xVals = new ArrayList<Float>();
        totalYvalues=new ArrayList<>();
        int j = 20;
        float willadd = 20;
        int[] nextarray = { // size: 144
                140, 80, 75, 71, 96, 78,
                90, 98, 78, 87, 83, 88,…

        };
        for (int i = 0; i < 143; i++) {

            int beforeValue = nextarray[i];
            int currentValue;
            currentValue = nextarray[i + 1];

            if (currentValue > beforeValue) {
                float todivide = currentValue - beforeValue;
                for (int w = beforeValue; w < currentValue; w += 1) {
                    totalYvalues.add(w - 30);
                    if (todivide < 4) todivide = 3;
                    willadd += ((canvas.getWidth()) / 143) / todivide; 
                    xVals.add(willadd);
                }
            } else {
                int todivide = beforeValue - currentValue;
                for (int w = beforeValue; w > currentValue; w -= 1) {
                    totalYvalues.add(w - 30);
                    if (todivide < 4) todivide = 3;
                    willadd += ((canvas.getWidth()) / 143 ) / todivide; //MATH**
                    xVals.add(willadd);
                }
            }
        }

        int ilk = totalYvalues.get(0);
        ArrayList<Integer> realY = new ArrayList<Integer>();
        realY.add(ilk);
        for (int i = 0; i < totalYvalues.size() - 1; i++) {

            int next = ilk - totalYvalues.get(i + 1);
            next = next + ilk;

            realY.add(next);
        }

        // totalYvalues = realY;
        totalYvalues = realY;


        drawBackground(canvas);
        drawLineChart(canvas);
        int i;
        a= centreY -  totalYvalues.get(1);

    }
    return null;

}

@Override
protected void onPostExecute(Void result) {
    viewholder.imgChartView.setImageBitmap(canvasBitmap);
    super.onPostExecute(result);

}

Линейный график рисуется следующими методами:

private void drawLineChart(Canvas canvas) {
Path path = new Path();
path.moveTo(getXPos(0), getYPos(totalYvalues.get(0)));
for (int i = 1; i < totalYvalues.size(); i++) {
    path.lineTo(getXPos(i), getYPos(totalYvalues.get(i)));
}

mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(4);
mPaint.setColor(0xFF33B5E5);
mPaint.setAntiAlias(true);
canvas.drawPath(path, mPaint);   }

private void drawBackground(Canvas canvas) {
float maxValue = getMax(totalYvalues);
int range = getLineDistance(maxValue);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(Color.GRAY);
for (int y = 0; y < maxValue; y += range) {
    final float yPos = getYPos(y);
    canvas.drawLine(0, yPos, globalImg.getWidth(), yPos, mPaint);
} }

0 ответов

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