我正在尝试使用@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));)
修复后的最终屏幕截图。
<?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;
答案 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
。