MPAndroidChart没有数据可用且没有PieChartDrawn

时间:2016-08-09 14:53:15

标签: java android mpandroidchart

我正在尝试使用@MPAndroidChartLibrary在GridFragment中绘制一些PieCharts但我仍然得到一个" No Data Available"没有渲染任何图表的消息。 我非常感谢帮助我们查看下面的代码。这就是用于创建PieCharts的内容。

[屏幕截图] [1]

package utils;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
import android.text.style.RelativeSizeSpan;
import com.github.mikephil.charting.charts.PieChart;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.PieData;
import com.github.mikephil.charting.data.PieDataSet;
import com.github.mikephil.charting.utils.ColorTemplate;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import java.io.BufferedReader;
import java.util.ArrayList;
import models.News;

/**
 * Created by Olaolu.Ajose on 14/07/2016.
 */
public class ResultHelper {
    static ArrayList < PieChart > mPieChartList;
    static Context mContext;

    public static ArrayList < PieChart > PieChartExtractor(Context context) {
        mPieChartList = new ArrayList < > ();
        mContext = context;
        try {

            for (int i = 0; i < 5; i++) {
                PieChart chart = getPieChart(mContext);
                mPieChartList.add(chart);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            return mPieChartList;
        }
        return mPieChartList;
    }

    private static PieChart getPieChart(Context context) {

        PieChart mChart = new PieChart(context);
        mChart.setDescription("");
        Typeface tf = Typeface.createFromAsset(context.getAssets(), "OpenSans-Light.ttf");

        mChart.setCenterTextTypeface(tf);
        mChart.setCenterText(generateCenterText());
        mChart.setCenterTextSize(10 f);
        mChart.setCenterTextTypeface(tf);

        // radius of the center hole in percent of maximum radius
        mChart.setHoleRadius(45 f);
        mChart.setTransparentCircleRadius(50 f);

        // radius of the center hole in percent of maximum radius
        mChart.setHoleRadius(45 f);
        mChart.setTransparentCircleRadius(50 f);

        Legend l = mChart.getLegend();
        l.setPosition(Legend.LegendPosition.RIGHT_OF_CHART);

        mChart.setData(generatePieData());
        mChart.notifyDataSetChanged();
        return mChart;
    }

    protected static PieData generatePieData() {

        int count = 4;

        ArrayList < Entry > entries1 = new ArrayList < Entry > ();
        ArrayList < String > xVals = new ArrayList < String > ();

        xVals.add("Quarter 1");
        xVals.add("Quarter 2");
        xVals.add("Quarter 3");
        xVals.add("Quarter 4");

        for (int i = 0; i < count; i++) {
            xVals.add("entry" + (i + 1));

            entries1.add(new Entry((float)(Math.random() * 60) + 40, i));
        }

        PieDataSet ds1 = new PieDataSet(entries1, "Quarterly Revenues 2015");
        ds1.setColors(ColorTemplate.VORDIPLOM_COLORS);
        ds1.setSliceSpace(2 f);
        ds1.setValueTextColor(Color.WHITE);
        ds1.setValueTextSize(12 f);

        PieData d = new PieData(xVals, ds1);

        return d;
    }

    private static SpannableString generateCenterText() {
        SpannableString s = new SpannableString("Revenues\nQuarters 2015");
        s.setSpan(new RelativeSizeSpan(2 f), 0, 8, 0);
        s.setSpan(new ForegroundColorSpan(Color.GRAY), 8, s.length(), 0);
        return s;
    }

}

//这是使用PieCharts的My Recycler。

package com.echessa.designdemo.QuizRecyclers;

  import android.content.Context;
  import android.graphics.Color;
  import android.support.v4.view.MotionEventCompat;
  import android.support.v7.widget.RecyclerView;
  import android.view.LayoutInflater;
  import android.view.MotionEvent;
  import android.view.View;
  import android.view.ViewGroup;

  import com.echessa.designdemo.R;
  import com.echessa.designdemo.helper.ItemTouchHelperViewHolder;
  import com.github.mikephil.charting.charts.PieChart;

  import java.util.List;

  import utils.ResultHelper;


  public class ResultBoardRecyclerAdapter extends         RecyclerView.Adapter<ResultBoardRecyclerAdapter.ViewHolder> {

     private List<PieChart> mPieCharts;
      static Context mContext;
     static List <PieChart> pieChartList;

public ResultBoardRecyclerAdapter(List<PieChart> pieChartItems) {
    mPieCharts = pieChartItems;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.piechart_item, viewGroup, false);
    mContext = v.getContext();
    return  new ViewHolder(v);
}

 @Override
public void onBindViewHolder(final ViewHolder viewHolder, int i) {
    viewHolder.mPieChart = GetResults().get(i);
    viewHolder.mPieChart.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {

            }
            return false;
        }
    });
}
 private static List<PieChart> GetResults() {
    if(pieChartList != null){
        return pieChartList;
    }
    List <PieChart> pieChartList =  ResultHelper.PieChartExtractor(mContext);
    return pieChartList;
}

@Override
public int getItemCount() {
    return mPieCharts.size();
}

public class ViewHolder extends RecyclerView.ViewHolder implements
        ItemTouchHelperViewHolder {

    private PieChart mPieChart;

    ViewHolder(View v) {
        super(v);
        mPieChart = (PieChart)v.findViewById(R.id.pieChart);
    }

    @Override
    public void onItemSelected() {
        itemView.setBackgroundColor(Color.LTGRAY);
    }

    @Override
    public void onItemClear() {
        itemView.setBackgroundColor(0);
    }
}
 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <com.github.mikephil.charting.charts.PieChart
        android:id="@+id/pieChart"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

使用此方法添加图表后的新屏幕截图。(viewHolder.mPieChart.addView(GetResults()。get(i));)

Screen shot after refactoring

修复后的最终屏幕截图。

&#13;
&#13;
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <com.github.mikephil.charting.charts.PieChart
        android:id="@+id/pieChart"
        android:layout_width="300dp"
        android:layout_height="300dp"  />

</LinearLayout>
&#13;
&#13;
&#13;

After all said and done

1 个答案:

答案 0 :(得分:0)

您遇到问题的原因是列表中显示的PieChart 您在PieChartExtractor方法中创建的<{1}} 。相反,它们是布局文件中定义的默认值,没有任何数据。

您需要将PieChart实际添加到视图中,只需将mPieChart对象设置为所需对象即可。给根LinearLayout一个id并将其在ViewHolder构造函数中加载到名为mRootLayout的变量中,然后执行:

@Override
public void onBindViewHolder(final ViewHolder viewHolder, int i) {
    viewHolder.mRootLayout.removeAllViews();
    viewHolder.mRootLayout.addView(GetResults().get(i));
    // ...
}

一般情况下,我建议您只在提取器中创建PieData,然后将适当的数据设置为PieChart,因为这样可以回收PieChart