1

ステータスが異なるSQLiteの注文のリストがあります:割り当て済み、ロード済み、配達済み。リストに表示されるときに、これらの注文ごとに異なる色の背景を使用したいと思います。これまでのところ、これを行う良い方法は見つかりませんでした。

位置に基づいてリスト項目の背景色を変更する方法についての議論はたくさんありますが、データの内容に基づいたものはありません。また、選択された項目を強調表示するために使用される色を変更する方法についての多くの議論も見つけました。これらは私を助けません。

問題を解決するために私が思いついた唯一の方法は、アダプターによってリストが作成された後、リスト全体を実行し、各項目に背景を設定することです。それは下品で無駄です。リストがカーソルから作成されているときにアダプターで背景を変更できる、より効率的な方法があることを願っています。

もっと良い方法があると確信しています。私はそれを知るにはAndroidに慣れていません。


これまでの反応に本当に感謝しています。それらを組み込むために最善を尽くしていますが、まだ成功していません。得られた回答と行った調査に基づいて、私が試したことは次のとおりです。

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

残念ながら、これは機能しません。super.getView() を呼び出さないと、明示的に転送を行っていないため、明らかにフィールドにデータがない状態になりますが、返されたビューを変更するだけでよいと考えました。

私のトレースは、データを読み取っていることを示していますが、背景色は変化していません。

変更しようとしているビューは LinearLayout のようですが、背景色を変更してもうまくいかないようです。

とった!すべての子ビューの背景を透明にしてください。

4

2 に答える 2

2

リストビュー用のカスタムアダプターを使用している場合は、 getView() メソッドがあり、戻る前にメソッドを呼び出し、色を変更したい場合に応じてビュー (返される) とデータを渡します。行。

public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    View view = convertView;
    if (view == null) {
        LayoutInflater vi = (LayoutInflater) _c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = vi.inflate(R.layout.list_item_var, null);
    }

    TextView varView = (TextView) view.findViewById(R.id.var);
    TextView valueView = (TextView) view.findViewById(R.id.value);

    VarDetails var = _data.get(position);
    setRowColor(view, var.getVar());
    varView.setText(var.var);
    valueView.setText("Value: " + var.value);

    return view;
}
private void setRowColor(View view, String var) {
    if("assigned".equalsIgnoreCase(var)){
        view.setBackgroundColor(Color.rgb(255,0,0));
    }else if("loaded".equalsIgnoreCase(var)){
        view.setBackgroundColor(Color.rgb(0,255,0));
    }else if("delivered".equalsIgnoreCase(var)){
        view.setBackgroundColor(Color.rgb(0,0,255));
    }
}

データ型に応じてメソッドを変更してください。

于 2013-04-24T08:13:03.367 に答える