将数据传递到自定义视图

Passing data to custom view

我想将数据传递到我的自定义视图,一个列表。它有效,但由于某些原因,我现在得到一个 Nullpointer 异常,我不知道为什么。

我通过构造函数传递数据,但列表大小始终为零,但是当我尝试在构造函数中获取列表大小时,我得到了正确的大小,但在它之外始终为 0。

MainActivity.java

LineChart2 lineChart2;
List<items> items = new ArrayList<>();


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    items.add(new items(R.color.babyBlau,10,"Internet"));
    items.add(new items(R.color.colorAccent,20,"Internet"));
    items.add(new items(R.color.rot,60,"Internet"));

    lineChart2 = new LineChart2(MainActivity.this,items);


}

LineChart2.java 包裹 com.example.viewtest;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

import java.util.ArrayList;
import java.util.List;

public class LineChart2 extends View {

List<items> items = new ArrayList<>();
Paint paintThinBlackLine;
Paint paintThinGrayLines;
Paint paintText;
float padding = 50;
float padding_left = padding * 3;
float padding_text = padding_left/2;

public LineChart2(Context context, List<com.example.viewtest.items> items) {
    super(context);
    this.items = items;
    initPaints();
}

public LineChart2(Context context, AttributeSet attrs) {
    super(context, attrs);
    initPaints();
}

public LineChart2(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initPaints();
}

public LineChart2(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    initPaints();
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int width = MeasureSpec.getSize(widthMeasureSpec);
    int height = MeasureSpec.getSize(heightMeasureSpec);
    setMeasuredDimension(width,width/2);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    // thin lines
    for(int i = 1; i < 7; i++){
        float paddingbetween = (getHeight()-padding-padding)/6;
        canvas.drawLine(padding_left,paddingbetween*i,getWidth()-padding,paddingbetween*i,paintThinGrayLines);
        Log.d("HALLO",""+items.size());
            //canvas.drawText(String.valueOf(items.get(i).value),padding_text,paddingbetween*i,paintText);

    }
}

public void initPaints(){
    paintThinBlackLine = new Paint();
    paintThinBlackLine.setColor(Color.parseColor("#6FB4B3B3"));
    paintThinBlackLine.setStyle(Paint.Style.STROKE);
    paintThinBlackLine.setStrokeCap(Paint.Cap.ROUND);
    paintThinBlackLine.setStrokeWidth(3);

    paintThinGrayLines = new Paint();
    paintThinGrayLines.setColor(Color.parseColor("#6FB4B3B3"));
    paintThinGrayLines.setStyle(Paint.Style.STROKE);
    paintThinGrayLines.setStrokeCap(Paint.Cap.ROUND);
    paintThinGrayLines.setStrokeWidth(2);

    paintText = new Paint();
    paintText.setTextSize(20);
    paintText.setColor(Color.parseColor("#FF696969"));
    paintText.setTextAlign(Paint.Align.CENTER);

}

}

我已经编译了你的代码并且运行良好。产生问题的唯一原因是在设置数据之前将布局附加到它的容器。

最好从下面的代码中添加您的布局。

    LinearLayout anyDesiredLayout= findViewById(R.id.layout);

    items.add(new items(R.color.colorAccent, 10, "Internet"));
    items.add(new items(R.color.colorAccent, 20, "Internet"));
    items.add(new items(R.color.colorAccent, 60, "Internet"));

    LineChart2 lineChart2 = new LineChart2(this, items);

    anyDesiredLayout.addView(lineChart2);

编辑

问题是您正在创建两个视图

此行 new LineChart2(this, items); 将创建新视图,该视图与您在 xml 中附加的视图不同。

lineChart2 的情况下,您可以看到 items 已在 lineChart2 构造函数中正确设置。但是 onDraw 尚未被调用,因为您没有将视图附加到任何容器。

并且您的 xml onDraw 方法中的视图将被调用,但您会发现 items 列表为空。因为 LineChart2(Context context, List<items> items) 从未被调用过。