Reputation: 349
I have problem in my app with achartengine pie chart. Everything works good, but when I'm trying to update chart with some filtered data chart legend becomes grey and click do not marks selected slice of chart.
When fragment starts:
When I click refresh:
My code:
public class StatistikaIslaidosFragment extends Fragment {
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;
}
}
}
Refresh button click code:
@Override
public void onClick(View v) {
mSeries.clear();
mRenderer = new DefaultRenderer();
chartData.clear();
collectChartData();
fillPieChart();
}
Please help me
Upvotes: 0
Views: 261
Reputation: 349
The problem was mRenderer = new DefaultRenderer();
I'm just changed this line of code to this:
mRenderer.removeAllRenderers();
Now works great :)
Upvotes: 0