如何根据每个项目中显示的数据更改列表项的背景颜色?

时间:2013-04-23 18:18:09

标签: android listview background-color simplecursoradapter

我在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,但更改背景颜色似乎不起作用。

知道了!确保所有子视图的背景透明。

2 个答案:

答案 0 :(得分:2)

如果你正在为listview使用任何自定义适配器,那么你将有一个方法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));
    }
}

请根据您的数据类型更改方法。

答案 1 :(得分:1)

我想说尝试扩展CursorAdapter以使用ListView绑定数据库。然后,您可以覆盖ListView.dispatchDraw()来自定义您的Paint对象。

或者检查一下可能有帮助:Customizing Android ListView Items with Custom ArrayAdapter

它根据天气状况使用不同的图像。移植到您的问题,您可以使用9-patch或以编程方式创建的Drawables作为背景,而不是更改Paint中的内容。