SQLite
 sql >> Datenbank >  >> RDS >> SQLite

Wie ändert man die Balkenfarbe in MPandroidCharts basierend auf einem in SQLite gespeicherten individuellen Wert?

So wie ich es verstehe, möchten Sie die Balken basierend auf bunk zeichnen aber färben Sie sie basierend auf credits . Die Verwendung des benutzerdefinierten Balkendatensatzes ist der richtige Ansatz, Sie müssen ihn nur ein wenig ändern. Der folgende Code erhält, was Sie beschreiben.

Von mir vorgenommene Änderungen:

  • Namensliste kann nicht an BarData übergeben werden verwenden Sie stattdessen einen Achsenwertformatierer
  • Benutzerdefiniertes Balken-Dataset geändert, um auch die credits zu enthalten Reihe. Nicht sicher, ob Ihr getEntryForXIndex -Methode ist an anderer Stelle definiert, aber nicht in dem von Ihnen geposteten Code.
  • Veraltete Aufrufe und ungültige Syntax entfernt (setDescription(""); kann nicht aufgerufen werden )

Wenn dies nicht das ist, wonach Sie suchen, aktualisieren Sie die Frage mit mehr Details zu dem, was Sie sehen usw. ... Soweit ich das beurteilen konnte, bezog sich die Frage auf das Diagramm und nicht auf die SQL-Datenbank.

@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);
        }
    }
}

BEARBEITEN: Eine Randbemerkung zur SQL-Datenbank - rufen Sie queryXData nicht auf und queryYData innerhalb der Schleife! Dadurch wird das gesamte Datenarray bei jeder Schleifeniteration extrahiert und dann erneut innerhalb der Schleife selbst (sehr teuer). Verwenden Sie stattdessen einfach so etwas:

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();