Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to do custom ListView with colorful items' backgrounds?

I have created an ArrayList<HashMap<String, String>> collection to hold my data for ListView. I'm using SimpleAdapter.

Is it possible to change background of list item when list item's ID % 10 == 0?

Here is the code (method generating layout):

private void fillData() {

    Cursor c = this.mDbManager.getNgOrderDetailByOrderNumber(this.mNumber);

    ArrayList<HashMap<String, String>> items = new ArrayList<HashMap<String, String>>();

    if (!c.isAfterLast()) {
       do {
           // ... filling HashMap and putting it to ArrayList
       } while (c.moveToNext());   
    }

    SimpleAdapter adapter = new SimpleAdapter(this, items, R.layout.list_item, 
        new String[] { "product", "ordered", "price", "discount" }, 
        new int[] { R.id.ProductTextView, R.id.OrderedTextView,
        R.id.PriceTextView, R.id.DiscountTextView });
     ListView l = (ListView) findViewById(android.R.id.list);
     l.setAdapter(adapter);
}
like image 300
peter.o Avatar asked Nov 16 '10 22:11

peter.o


2 Answers

You override getView in your adapter to make changes to the view. Keep in mind that ListView reuses the view implementations, so if you change the color to item 10, make sure you set the color to the opposite for all other views.

e.g.

new SimpleAdapter( ... ) {
  @Override
  public View getView (int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);
    if (position == 10) {
      // set background color = red;
    } else {
      // set background color = green;
    }
    return view;
  }
}
like image 50
Cheryl Simon Avatar answered Oct 14 '22 01:10

Cheryl Simon


Here is the code, hope it'll be helpful for other users

private void fillData() {

    Cursor c = this.mDbManager.getNgOrderDetailByOrderNumber(this.mNumber);

    ArrayList < HashMap < String, String >> items = new ArrayList < HashMap < String, String >> ();

    if (!c.isAfterLast()) {
        do {
            // ... filling HashMap and putting it to ArrayList
        } while (c.moveToNext());
    }

    SimpleAdapter adapter = new SimpleAdapter(this, items, R.layout.list_item,
        new String[] {
        "product", "ordered", "price", "discount"
    },
        new int[] {
        R.id.ProductTextView, R.id.OrderedTextView,
        R.id.PriceTextView, R.id.DiscountTextView
    }) {

        // here is the method you need to override, to achieve colorful list

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            View view = super.getView(position, convertView, parent);

            HashMap < String, String > items = (HashMap < String, String > ) getListView()
                .getItemAtPosition(position);
            if (Long.parseLong(items.get("id")) % 10 == 0) {
                view.setBackgroundColor(Color.GREEN);
            } else {
                view.setBackgroundColor(Color.YELLOW);
            }
            return view;
        }

    };
    ListView l = (ListView) findViewById(android.R.id.list);
    l.setAdapter(adapter);
}
like image 45
peter.o Avatar answered Oct 14 '22 01:10

peter.o