Wie kann ich die Hintergrundfarbe von Listenelementen basierend auf den in den einzelnen Elementen angezeigten Daten ändern?

Ich habe eine Liste von Aufträgen in SQLite, deren Status variiert: zugewiesen, geladen, geliefert. Ich möchte, dass jeder dieser Aufträge, wenn er in der Liste angezeigt wird, einen anderen farbigen Hintergrund hat. Bisher habe ich keinen guten Weg gefunden, dies zu tun.

Ich habe viele Diskussionen darüber gefunden, wie man die Hintergrundfarbe von Listenelementen basierend auf der Position ändert, aber keine basierend auf dem Dateninhalt. Ich habe auch viele Diskussionen darüber gefunden, wie man die Farbe ändert, die zum Hervorheben eines ausgewählten Elements verwendet wird. Diese helfen mir nicht.

Die einzigen Methoden, mit denen ich mein Problem lösen kann, sind das Durchlaufen der gesamten Liste, nachdem sie vom Adapter erstellt wurde, und das Festlegen des Hintergrunds für jedes Element. Es ist klobig und verschwenderisch. Ich hoffe, es gibt eine effizientere Methode, mit der der Hintergrund im Adapter geändert werden kann, während die Liste mit dem Cursor erstellt wird.

Ich bin mir sicher, dass es einen besseren Weg gibt. Ich bin einfach zu neu für Android, um es zu wissen.

Ich schätze die bisherigen Antworten sehr. Ich gebe mein Bestes, um sie einzubeziehen, aber ich habe immer noch keinen Erfolg. Folgendes habe ich gerade ausprobiert, basierend auf den Antworten und den Recherchen, die ich durchgeführt habe.

public class OrderListAdapter extends SimpleCursorAdapter {

    private static final String TAG = "SimpleCursorAdapter";
    Context _context = null;
    int layoutResourceId = 0;

    public OrderListAdapter(Context context, int layout, Cursor c,
            String[] from, int[] to, int flags) {
        super(context, layout, c, from, to, flags);
        _context = context;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);
        String tag = TAG + ".getView()";
        Log.d(tag,"in getView()");

        if (view == null) {
            LayoutInflater inflater = ((Activity)_context).getLayoutInflater();
            view = inflater.inflate(R.layout.fragment_order_list_row, null);
        }
        setRowColor(view);
        return view;
    }

    private void setRowColor(View view) {
        String tag = TAG + ".setRowColor()";
        Cursor cursor = getCursor();
        int col = cursor
                .getColumnIndex(DBContract.DeliveryOrderTable.ENROUTE_FLAG);
        String enroute_flag = cursor.getString(col);
        Log.d(tag, "enroute_flag = [" + enroute_flag + "]");
        col = cursor
                .getColumnIndex(DBContract.DeliveryOrderTable.DELIVERED_DATETIME);
        String deliveredDateStr = cursor.getString(col);
        Log.d(tag, "deliveredDateStr = [" + deliveredDateStr + "]");
        int bgColorId = 0;
        if (!deliveredDateStr.equals("")) {
            bgColorId = R.color.bg_status_delivered_color;
            Log.d(tag, "Setting to delivered color");
        } else if (enroute_flag.startsWith("T") || enroute_flag.startsWith("Y")) {
            Log.d(tag, "Setting to enroute color");
            bgColorId = R.color.bg_status_enroute_color;
        } else {
            Log.d(tag, "Setting to assigned color");
            bgColorId = R.color.bg_status_assigned_color;
        }
        view.setBackgroundColor(_context.getResources().getColor(bgColorId));
    }
}

Das funktioniert leider nicht. Wenn ich den Aufruf von super.getView () nicht tätige, werden offensichtlich keine Daten in den Feldern angezeigt, da ich die Übertragungen nicht explizit durchführe, aber ich dachte, ich könnte einfach die zurückgegebene Ansicht ändern.

Meine Spuren zeigen mir, dass ich die Daten lese, aber die Hintergrundfarbe ändert sich nicht.

Es scheint, dass die Ansicht, die ich ändern möchte, das Lineare Layout ist, aber das Ändern der Hintergrundfarbe scheint nicht zu funktionieren.

Ich habs! Stellen Sie sicher, dass die Hintergründe aller untergeordneten Ansichten transparent sind.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage