2

Im с использованием горизонтальной диаграммы MPAndroid для отображения доходов/расходов и диаграммы работает максимально. Я могу изменить отображаемую информацию, хотя я могу ее изменить только в том случае, если я это сделаю в OnViewCreated. Ничего не происходит, если я попытаюсь сделать это из активности, в которой отображается фрагмент, и я совершенно не знаю, почему. Хотя я не уверен на 100%, если правильно настрою данные.MPAndroid Chart - Chart не обновляется

public class BudgetFragment extends Fragment{ 

private HorizontalBarChart mainChart; 
private BarData data; 
private BarDataSet dataset1; 
private BarDataSet dataset2; 

private int expenseSum = 0; 
private int incomeSum = 0; 

public MainActivityBudgetFragment(){ 

} 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.budget_fragment, container, false); 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    mainChart = (HorizontalBarChart) view.findViewById(R.id.mainBudgetChart); 

    ArrayList<BarEntry> entries1 = new ArrayList<>(); 
    ArrayList<BarEntry> entries2 = new ArrayList<>(); 

    entries1.add(new BarEntry(10000, 5)); 
    entries2.add(new BarEntry(10000, 5)); 

    dataset1 = new BarDataSet(entries1, "income"); 
    dataset2 = new BarDataSet(entries2, "expense"); 

    //X-axis labels 
    ArrayList<String> xVals = new ArrayList<String>(); 
    xVals.add("income"); xVals.add("expense"); 

    ArrayList<BarDataSet> dataSets = new ArrayList<BarDataSet>(); 
    dataSets.add(dataset1); 
    dataSets.add(dataset2); 

    //Add to chart 
    data = new BarData(xVals, dataSets); 


    mainChart.setData(data); 

    //Description and animation 
    mainChart.setDescription(""); // set the description 
    mainChart.setScaleYEnabled(false); 
    mainChart.setTouchEnabled(false); 
    mainChart.animateY(2000); 

    setDataExpense(200);//(This works fine) 
    setDataIncome(200); //(This works fine) 
} 

public void updateDataExpense(){ 
    Log.e("updateTag", "Updated expense"); 

    dataset2.removeEntry(1); 
    data.addEntry(new BarEntry(expenseSum, 1), 1); 
    dataset2.setColor(getResources().getColor(R.color.orange)); 
    mainChart.notifyDataSetChanged(); // let the chart know it's data changed 
    mainChart.invalidate(); // refresh 
} 

public void updateDataIncome(){ 

    Log.e("updateTag", "Updated Income"); 
    dataset1.removeEntry(0); 
    data.addEntry(new BarEntry(newIncome, 0), 0); 
    dataset1.setColor(getResources().getColor(R.color.green)); 
    mainChart.notifyDataSetChanged(); // let the chart know it's data changed 
    mainChart.invalidate(); // refresh 
} 

//(These do not work when called outside OnViewCreated) 
private void setDataExpense(int sum){ 
    expenseSum = (expenseSum + sum); 
    Log.d("ResumeTag", "expense set at " + expenseSum); 
    updateDataExpense(); 
} 

private void setDataIncome(int sum){ 
    incomeSum = (incomeSum + sum); 
    Log.d("ResumeTag", "income set at " + incomeSum); 
    updateDataIncome(); 
} 

}

Позвольте мне знать, если я забыл что-то важное. У меня нет большого опыта в задании вопросов по Stackoverflow.

Благодарим за помощь! // Крис

ответ

0

Пожалуйста, попробуйте следующее:

public void updateDataIncome() { 
    Log.e("updateTag", "Updated Income"); 
    dataset1.removeEntry(0); 
    data.addEntry(new BarEntry(newIncome, 0), 0); 
    dataset1.setColor(getResources().getColor(R.color.green)); 

    data.notifyDataChanged(); // NOTIFIES THE DATA OBJECT 

    mainChart.notifyDataSetChanged(); // let the chart know it's data changed 
    mainChart.invalidate(); // refresh 
} 
0

Ваш вопрос не сказать, что действие выполняется, для которых предполагается, что данные будут обновлены. Что бы вы ни делали, чтобы данные обновлялись, у вас должен быть один из слушателей, а затем вызывать свои функции, которые заполняют данные, которые вы хотите обновить.

Например, в этом коде при выборе значения в Spinner, onItemSelected (..) вызывается & внутри него мы вызываем функцию заполнения, которая обновляет данные. Это частичный код, но вы можете найти полный пример использования адаптера & OnItemSelectedListener. Надеюсь, это поможет вам.

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, monthList); 
     // Setting the array adapter containing country list to the spinner widget 
     spinnerMonth.setAdapter(adapter); 
     AdapterView.OnItemSelectedListener monthSelectedListener = new AdapterView.OnItemSelectedListener() 
     { 

      @Override 
      public void onItemSelected(AdapterView<?> spinner, View container, 
             int position, long id) { 
       Log.d("Logger:MainAct"," onItemSelected:Entry::::"); 
       tvMonth.setText("Chart for "+strMonth[position]); 
       populateChartByMonth(strMonth[position]); 
       //Toast.makeText(getApplicationContext(), "Success : " + strMonth[position], Toast.LENGTH_SHORT).show(); 
       Log.d("Logger:MainAct"," onItemSelected:Exit::::"); 
      } 


      @Override 
      public void onNothingSelected(AdapterView<?> arg0) { 
       // TODO Auto-generated method stub 
       Log.d("Logger:MainAct"," onNothingSelected:Entry/Exit"); 

      } 
     }; 
0
entries1.add(new BarEntry(10000, 5)); 

Эта линия значение х равно 1, а значение Y 10000

entries1.add(new BarEntry(5,10000)); 
Смежные вопросы