Jak mogę zmienić kolor tła elementów listy na podstawie danych wyświetlanych w każdym elemencie?

Mam listę zamówień w SQLite, które różnią się statusem: przypisane, załadowane, dostarczone. Chciałbym, aby każde z tych zamówień, gdy jest wyświetlane na liście, miało inne kolorowe tło. Do tej pory nie znalazłem dobrego sposobu, aby to zrobić.

Znalazłem wiele dyskusji na temat tego, jak zmienić kolor tła elementów listy na podstawie pozycji, ale żaden nie opiera się na zawartości danych. Znalazłem również wiele dyskusji na temat zmiany koloru używanego do wyróżnienia wybranego elementu. Te mi nie pomagają.

Jedyne metody, które wymyślę, aby rozwiązać mój problem, to przeglądanie całej listy po utworzeniu jej przez adapter i ustawienie tła na każdym elemencie. Jest niezgrabny i marnotrawny. Mam nadzieję, że istnieje bardziej wydajna metoda, która pozwoliłaby na zmianę tła w karcie podczas tworzenia listy z kursora.

Jestem pewien, że jest lepszy sposób. Jestem zbyt nowa dla Androida, żeby to wiedzieć.

Naprawdę doceniam dotychczasowe odpowiedzi. Robię, co w mojej mocy, aby je włączyć, ale wciąż nie osiągam sukcesu. Oto, co właśnie wypróbowałem, na podstawie odpowiedzi, które otrzymałem, i badań, które zrobiłem.

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

Niestety to nie działa. Jeśli nie wykonam wywołania do super.getView (), nie mam oczywiście żadnych danych w polach, ponieważ nie przekazuję jawnie transferów, ale pomyślałem, że mogę po prostu zmodyfikować zwrócony widok.

Moje ślady pokazują mi, że czytam dane, ale kolor tła się nie zmienia.

Wygląda na to, że widok, który próbuję zmienić, to LinearLayout, ale zmiana koloru tła nie działa.

Rozumiem! Upewnij się, że tła wszystkich widoków potomnych są przezroczyste.

questionAnswers(2)

yourAnswerToTheQuestion