Search code examples
javaandroidandroid-studiopie-chart

Android Pie Chart doesn't refresh pie graph if data change value


I can't refresh my pie chart from my listener Spinner: setOnItemSelectedListener inside a Fragment.

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

ArrayAdapter adapterSpinnerTeams = new ArrayAdapter(getActivity(), android.R.layout.simple_spinner_item, teamsName);
        adapterSpinnerTeams.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinnerTeamsAnalysis.setAdapter(adapterSpinnerTeams);

spinnerTeamsAnalysis.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
                anyChartView2 = v.findViewById(R.id.anyChartView2);
                APIlib.getInstance().setActiveAnyChartView(anyChartView2);
                setUpPieChart(spinnerTeamsAnalysis.getSelectedItem().toString());
            }

            @Override
            public void onNothingSelected(AdapterView<?> parentView) {
                return;
            }

        });

  return v;
}

public void setUpPieChart(String teamSelected) {
        anyChartView2 = v.findViewById(R.id.anyChartView2);
        APIlib.getInstance().setActiveAnyChartView(anyChartView2);

        Pie pie = AnyChart.pie();
        List<DataEntry> dataEntries = new ArrayList<>();

        creditsByRoles = calculateCredits(teamSelected, creditsByRoles);

        for(int i=0; i<roles.length; i++) {
            dataEntries.add(new ValueDataEntry(roles[i], creditsByRoles[i]));
        }

        pie.data(dataEntries);

        pie.title("title");

        anyChartView2.setChart(pie);
}

NB. Method calculateCredits(teamSelected, creditsByRoles) return an array of Integer.

When spinner change value the pie chart doesn't change value.

Is there any solution?


Solution

  • I have resolved in this way:

    pieChart = v.findViewById(R.id.pieChart);
            APIlib.getInstance().setActiveAnyChartView(pieChart);
    
            final Pie pie = AnyChart.pie();
            List<DataEntry> dataEntries = new ArrayList<>();
    
            creditsByRoles = calculateCredits(teamSelected, creditsByRoles);
    
            for(int i=0; i<roles.length; i++) {
                dataEntries.add(new ValueDataEntry(roles[i], creditsByRoles[i]));
            }
    
            pie.data(dataEntries);
    
            pieChart.setChart(pie);
    
            /* Per permettere il refresh in caso di cambio valori */
            final int delayMillis = 500;
            final Handler handler = new Handler();
            final Runnable runnable = new Runnable() {
                public void run() {
                    List<DataEntry> data = new ArrayList<>();
                    for(int i=0; i<roles.length; i++) {
                        data.add(new ValueDataEntry(roles[i], creditsByRoles[i]));
                    }
                    pie.data(data);
    
                    handler.postDelayed(this, delayMillis);
                }
            };
            handler.postDelayed(runnable, delayMillis);