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);
} }