Android achartengine 饼图更新图例错误
Android achartengine pie chart update legend bug
我的应用程序在使用图表引擎饼图时遇到问题。一切正常,但是当我尝试使用一些过滤数据更新图表时,图表图例变为灰色并且单击不标记选定的图表切片。
片段开始时:
当我点击刷新时:
我的代码:
public class StatistikaIslaidosFragment 扩展片段 {
private DBhelper db;
private HashMap<String, Double> chartData;
private View mRootView;
private static int[] COLORS = new int[] { Color.RED, Color.BLUE, Color.MAGENTA, Color.CYAN, Color.YELLOW, Color.WHITE, Color.DKGRAY };
private CategorySeries mSeries = new CategorySeries("");
private DefaultRenderer mRenderer = new DefaultRenderer();
private GraphicalView mChartView;
private Button firstDate, secondDate;
private ImageButton refresh;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mRootView = inflater.inflate(R.layout.fragment_statistika_islaidos, container, false);
db = new DBhelper(mRootView.getContext());
chartData = new HashMap<String, Double>();
firstDate = (Button) mRootView.findViewById(R.id.buttonDate1);
secondDate = (Button) mRootView.findViewById(R.id.buttonDate2);
refresh = (ImageButton) mRootView.findViewById(R.id.buttonRefresh);
dateButtonsClick();
collectChartData();
fillPieChart();
sliceClick();
return mRootView;
}
private void setDayToToday(){
Calendar c = Calendar.getInstance();
c.roll(Calendar.MONTH, false);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = sdf.format(c.getTime());
firstDate.setText(formattedDate);
c = Calendar.getInstance();
formattedDate = sdf.format(c.getTime());
secondDate.setText(formattedDate);
}
private void dateButtonsClick(){
setDayToToday();
firstDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DialogFragment picker = new DatePickerFragmentStatistic1();
picker.show(getActivity().getFragmentManager(), "datePicker");
}
});
secondDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DialogFragment picker = new DatePickerFragmentStatistic2();
picker.show(getActivity().getFragmentManager(), "datePicker");
}
});
refresh.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mSeries.clear();
mRenderer = new DefaultRenderer();
chartData.clear();
collectChartData();
fillPieChart();
}
});
}
private void sliceClick(){
mChartView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SeriesSelection seriesSelection = mChartView.getCurrentSeriesAndPoint();
if (seriesSelection == null) {
showMessage("No chart element was clicked");
} else {
for (int i = 0; i < mSeries.getItemCount(); i++) {
mRenderer.getSeriesRendererAt(i).setHighlighted(i == seriesSelection.getPointIndex());
}
mChartView.repaint();
showMessage("Chart element data point index " + seriesSelection.getPointIndex()
+ " was clicked" + " point value=" + seriesSelection.getValue());
}
}
});
}
private void showMessage(String text){
Toast.makeText(mRootView.getContext(), text, Toast.LENGTH_LONG).show();
}
private void chartSetings(){
mRenderer.setApplyBackgroundColor(true);
mRenderer.setBackgroundColor(getResources().getColor(R.color.theme_color));
mRenderer.setChartTitleTextSize(20);
mRenderer.setLabelsTextSize(40);
mRenderer.setShowLabels(false);
mRenderer.setLegendTextSize(40);
mRenderer.setMargins(new int[]{20, 30, 15, 0});
mRenderer.setZoomButtonsVisible(false);
mRenderer.setStartAngle(90);
if (mChartView == null) {
LinearLayout layout = (LinearLayout) mRootView.findViewById(R.id.chart);
mChartView = ChartFactory.getPieChartView(mRootView.getContext(), mSeries, mRenderer);
mRenderer.setClickEnabled(true);
mRenderer.setSelectableBuffer(10);
layout.addView(mChartView, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.FILL_PARENT));
} else {
mChartView.repaint();
}
}
private void fillPieChart(){
chartSetings();
for(String key: chartData.keySet())
{
mSeries.add(key.toString(), chartData.get(key));
SimpleSeriesRenderer renderer = new SimpleSeriesRenderer();
renderer.setColor(COLORS[(mSeries.getItemCount() - 1) % COLORS.length]);
mRenderer.addSeriesRenderer(renderer);
if (mChartView != null)
mChartView.repaint();
}
}
private void collectChartData(){
List<Operation> data = db.getAllOperations();
for (Operation op:data){
Date start = strToDate(firstDate.getText().toString());
Date finish = new Date();
Date opDate = strToDate(op.getDate());
if(op.getName().equals(getResources().getString(R.string.islaidos))) {
if(opDate.after(start) && opDate.before(finish)) {
if (chartData.containsKey(op.getCategory())) {
chartData.put(op.getCategory(), chartData.get(op.getCategory()) + Double.parseDouble(op.getMoney()));
} else {
chartData.put(op.getCategory(), Double.parseDouble(op.getMoney()));
}
}
}
}
}
private Date strToDate(String str){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = format.parse(str);
return date;
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
}
刷新按钮点击代码:
@Override
public void onClick(View v) {
mSeries.clear();
mRenderer = new DefaultRenderer();
chartData.clear();
collectChartData();
fillPieChart();
}
请帮帮我
问题是 mRenderer = new DefaultRenderer();
我刚刚将这行代码更改为:
mRenderer.removeAllRenderers();
现在效果很好:)
我的应用程序在使用图表引擎饼图时遇到问题。一切正常,但是当我尝试使用一些过滤数据更新图表时,图表图例变为灰色并且单击不标记选定的图表切片。
片段开始时:
当我点击刷新时:
我的代码:
public class StatistikaIslaidosFragment 扩展片段 {
private DBhelper db;
private HashMap<String, Double> chartData;
private View mRootView;
private static int[] COLORS = new int[] { Color.RED, Color.BLUE, Color.MAGENTA, Color.CYAN, Color.YELLOW, Color.WHITE, Color.DKGRAY };
private CategorySeries mSeries = new CategorySeries("");
private DefaultRenderer mRenderer = new DefaultRenderer();
private GraphicalView mChartView;
private Button firstDate, secondDate;
private ImageButton refresh;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mRootView = inflater.inflate(R.layout.fragment_statistika_islaidos, container, false);
db = new DBhelper(mRootView.getContext());
chartData = new HashMap<String, Double>();
firstDate = (Button) mRootView.findViewById(R.id.buttonDate1);
secondDate = (Button) mRootView.findViewById(R.id.buttonDate2);
refresh = (ImageButton) mRootView.findViewById(R.id.buttonRefresh);
dateButtonsClick();
collectChartData();
fillPieChart();
sliceClick();
return mRootView;
}
private void setDayToToday(){
Calendar c = Calendar.getInstance();
c.roll(Calendar.MONTH, false);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = sdf.format(c.getTime());
firstDate.setText(formattedDate);
c = Calendar.getInstance();
formattedDate = sdf.format(c.getTime());
secondDate.setText(formattedDate);
}
private void dateButtonsClick(){
setDayToToday();
firstDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DialogFragment picker = new DatePickerFragmentStatistic1();
picker.show(getActivity().getFragmentManager(), "datePicker");
}
});
secondDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DialogFragment picker = new DatePickerFragmentStatistic2();
picker.show(getActivity().getFragmentManager(), "datePicker");
}
});
refresh.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mSeries.clear();
mRenderer = new DefaultRenderer();
chartData.clear();
collectChartData();
fillPieChart();
}
});
}
private void sliceClick(){
mChartView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SeriesSelection seriesSelection = mChartView.getCurrentSeriesAndPoint();
if (seriesSelection == null) {
showMessage("No chart element was clicked");
} else {
for (int i = 0; i < mSeries.getItemCount(); i++) {
mRenderer.getSeriesRendererAt(i).setHighlighted(i == seriesSelection.getPointIndex());
}
mChartView.repaint();
showMessage("Chart element data point index " + seriesSelection.getPointIndex()
+ " was clicked" + " point value=" + seriesSelection.getValue());
}
}
});
}
private void showMessage(String text){
Toast.makeText(mRootView.getContext(), text, Toast.LENGTH_LONG).show();
}
private void chartSetings(){
mRenderer.setApplyBackgroundColor(true);
mRenderer.setBackgroundColor(getResources().getColor(R.color.theme_color));
mRenderer.setChartTitleTextSize(20);
mRenderer.setLabelsTextSize(40);
mRenderer.setShowLabels(false);
mRenderer.setLegendTextSize(40);
mRenderer.setMargins(new int[]{20, 30, 15, 0});
mRenderer.setZoomButtonsVisible(false);
mRenderer.setStartAngle(90);
if (mChartView == null) {
LinearLayout layout = (LinearLayout) mRootView.findViewById(R.id.chart);
mChartView = ChartFactory.getPieChartView(mRootView.getContext(), mSeries, mRenderer);
mRenderer.setClickEnabled(true);
mRenderer.setSelectableBuffer(10);
layout.addView(mChartView, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.FILL_PARENT));
} else {
mChartView.repaint();
}
}
private void fillPieChart(){
chartSetings();
for(String key: chartData.keySet())
{
mSeries.add(key.toString(), chartData.get(key));
SimpleSeriesRenderer renderer = new SimpleSeriesRenderer();
renderer.setColor(COLORS[(mSeries.getItemCount() - 1) % COLORS.length]);
mRenderer.addSeriesRenderer(renderer);
if (mChartView != null)
mChartView.repaint();
}
}
private void collectChartData(){
List<Operation> data = db.getAllOperations();
for (Operation op:data){
Date start = strToDate(firstDate.getText().toString());
Date finish = new Date();
Date opDate = strToDate(op.getDate());
if(op.getName().equals(getResources().getString(R.string.islaidos))) {
if(opDate.after(start) && opDate.before(finish)) {
if (chartData.containsKey(op.getCategory())) {
chartData.put(op.getCategory(), chartData.get(op.getCategory()) + Double.parseDouble(op.getMoney()));
} else {
chartData.put(op.getCategory(), Double.parseDouble(op.getMoney()));
}
}
}
}
}
private Date strToDate(String str){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = format.parse(str);
return date;
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
}
刷新按钮点击代码:
@Override
public void onClick(View v) {
mSeries.clear();
mRenderer = new DefaultRenderer();
chartData.clear();
collectChartData();
fillPieChart();
}
请帮帮我
问题是 mRenderer = new DefaultRenderer();
我刚刚将这行代码更改为:
mRenderer.removeAllRenderers();
现在效果很好:)