基类ChartData类封装了所有的数据和信息那是在图表绘制期间需要的。对于每种类型的图表,ChartData的不同的子类(例如LineData)存在应该被用来为图表设置数据。在构造函数中,你能移交数据到ArrayList模板,并且作为值来显示,另外字符串的ArrayList将描述在x轴的标签。例如类LineData(继承自ChartData),用来增加数据到LineChart:

    1. public LineData(ArrayList<String> xVals, ArrayList<LineDataSet> sets) { ... }

    因此,什么是DataSet为什么需要它?那实际上相当简单。在图表内互相在一起的数据集对象表示一组条目(数据条目类型)。它被设计用来区分在图表中逻辑上不同组的值。对于每种类型的图表,扩展数据集 (例如 LineDataSet) 的不同对象存在允许特定的样式。
    作为一个例子,你可能想用LineChart展示两个不同公司的季度收入在一年中的。在这种情况下,建议你创建两个不同的LineDataSet对象,每个包含四个值(每个代表一个季度)。用ArrayList来描述x轴上的标签,你可以简单的提供四个字符串“1.Q”,“2.Q”,“3.Q”,“4.Q”
    当然,你只提供一个包含两个公司8个值的LineDataSet对象也是可以的。

    在查找构造函数时(不同的构造函数可用),它是可见的,LinedataSet需要一个ArrayList条目类型和一个字符串用来描述LineDataSet以及用于图表标签。更进一步这个标签能被用来寻找在LineData对象中除LineDataSet对象外的其他LineDataSet。
    ArrayList条目类型封装了图表的所有值。一个Entry对象除了封装它周围的值还保存了它自己的值,它的位置在x轴(在LineData对象的字符串类型的ArrayList里面值的索引被映射):

    1. public Entry(float val, int xIndex) { ... }

    把它们放在一起(例如两个公司 一年里的季度收入):
    首先,创建Entry的类型的列表保存你的值:

    1. Entry c1e1 = new Entry(100.000f, 0); // 0 == quarter 1
    2. valsComp1.add(c1e1);
    3. Entry c1e2 = new Entry(50.000f, 1); // 1 == quarter 2 ...
    4. valsComp1.add(c1e2);
    5. Entry c2e1 = new Entry(120.000f, 0); // 0 == quarter 1
    6. valsComp2.add(c2e1);
    7. Entry c2e2 = new Entry(110.000f, 1); // 1 == quarter 2 ...
    8. valsComp2.add(c2e2);
    9. //...

    现在我们有了Entry对象的列表,LineDataSet对象可以被创建:

    但是还没完,我们创建一个DataSets的列表和一个x轴条目的列表并且构建我们的ChartData对象:

    1. ArrayList<LineDataSet> dataSets = new ArrayList<LineDataSet>();
    2. ArrayList<String> xVals = new ArrayList<String>();
    3. xVals.add("1.Q"); xVals.add("2.Q"); xVals.add("3.Q"); xVals.add("4.Q");
    4. LineData data = new LineData(xVals, dataSets);
    5. mLineChart.setData(data);