sql >> Base de Datos >  >> RDS >> SQLite

¿Cómo cambiar el color de la barra en MPandroidCharts en función de algún valor individual almacenado en sqlite?

Según tengo entendido, desea trazar las barras en función de bunk pero coloréalos según los credits . Usar el conjunto de datos de barra personalizado es el enfoque correcto, solo necesita modificarlo un poco. El siguiente código obtiene lo que estás describiendo.

Cambios que hice:

  • No se puede pasar la lista de nombres a BarData , use un formateador de valores de eje en su lugar
  • Se modificó el conjunto de datos de la barra personalizada para que también contenga los credits formación. No estoy seguro si su getEntryForXIndex El método está definido en otro lugar, pero no está en el código que publicaste.
  • Se eliminaron las llamadas en desuso y la sintaxis no válida (no se puede llamar a setDescription(""); )

Si esto no es lo que está buscando, actualice la pregunta con más detalles sobre lo que está viendo, etc. Por lo que pude ver, la pregunta era sobre el gráfico y no sobre la base de datos SQL.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    BarChart chart = findViewById(R.id.test_chart);

    // Some made up data - replace these with your
    //  queryYdata, queryXdata, and queryZdata methods
    String[] names = new String[]{"foo","bar","fiz","bam","boo"};
    List<Float> credits = new ArrayList<>(Arrays.asList(1f,9f,2.5f,15f,50f));
    float[] bunks = new float[]{10f,15f,16f,20f,5f};

    List<BarEntry> entries = new ArrayList<>();
    for(int i = 0; i < bunks.length; ++i) {
        entries.add(new BarEntry(i, bunks[i]));
    }

    float textSize = 16f;

    MyBarDataset dataSet = new MyBarDataset(entries, "data", credits);
    dataSet.setColors(ContextCompat.getColor(this,R.color.green),
            ContextCompat.getColor(this,R.color.yellow),
            ContextCompat.getColor(this,R.color.red));
    BarData data = new BarData(dataSet);
    data.setDrawValues(false);
    data.setBarWidth(0.9f);

    chart.setData(data);
    chart.setFitBars(true);
    chart.getXAxis().setValueFormatter(new IndexAxisValueFormatter(names));
    chart.getXAxis().setPosition(XAxis.XAxisPosition.BOTTOM);
    chart.getXAxis().setTextSize(textSize);
    chart.getAxisLeft().setTextSize(textSize);
    chart.setExtraBottomOffset(10f);

    chart.getAxisRight().setEnabled(false);
    Description desc = new Description();
    desc.setText("");
    chart.setDescription(desc);
    chart.getLegend().setEnabled(false);
    chart.getXAxis().setDrawGridLines(false);
    chart.getAxisLeft().setDrawGridLines(false);

    chart.invalidate();
}

public class MyBarDataset extends BarDataSet{

    private List<Float> credits;

    MyBarDataset(List<BarEntry> yVals, String label, List<Float> credits) {
        super(yVals, label);
        this.credits = credits;
    }

    @Override
    public int getColor(int index){
        float c = credits.get(index);

        if (c < 8){
            return mColors.get(0);
        }
        else if (c < 13) {
            return mColors.get(1);
        }
        else {
            return mColors.get(2);
        }
    }
}

EDITAR: Un aparte sobre la base de datos SQL:no llame a queryXData y queryYData dentro del bucle! Esto extraerá toda la matriz de datos en cada iteración del ciclo, luego nuevamente dentro del ciclo (muy costoso). Solo usa algo como esto en su lugar:

ArrayList<BarEntry> yVals = new ArrayList<>();
ArrayList<Integer> yData = myhelper.queryYdata();
for (int i=0; i<yData.size(); i++){
    yVals.add(new BarEntry(i,yData.get(i)));
}

ArrayList<String> xData = myhelper.queryXdata();