Android: ListView — разноцветные items?

Здравствуйте, возможно ли имплементировать следующее, и если возможно, то буду благодарен за кусочек кода, если нет, то хотя бы какие-то советы.


Хочу сделать так чтоб при загрузке моего ListView каждый item закрашивался в определенный цвет(например какой то мой градиент) и при клике тоже менять.

Ну как при клике менять цвет примеров есть, а вот как сделать так чтоб все items создавались разноцветными..?


Пока что состояние вот такое

import java.util.List;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

public class RowAdapter extends BaseAdapter
{
    private List<Row> elements;
    private Context context;

    public RowAdapter(Context c, List<Row> rows) {
        this.elements = rows;
        this.context = c;
    }

    @Override
    public int getCount() {
        return elements.size();
    }

    @Override
    public Object getItem(int position) {
        return elements.get(position);
    }

    @Override
    public long getItemId(int id) {
        return id;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return elements.get(position);
    }
}


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.DisplayMetrics;
import android.view.View;

public class Row extends View {

	private DisplayMetrics displayMetrics;

	public Row(Context context, DisplayMetrics displayMetrics) {
		super(context);
		this.displayMetrics = displayMetrics;
	}

	@Override
	public void onDraw(Canvas canvas) {
		Paint paint = new Paint();

		int xPos = (canvas.getWidth() / 2);
		int yPos = (int) ((canvas.getHeight() / 2) - ((paint.descent() + paint.ascent()) / 2));

		paint.setColor(Color.GREEN);
		paint.setTextSize(30);
		canvas.drawText("Some Text", xPos, yPos, paint);
	}

	@Override
	public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		setMeasuredDimension(displayMetrics.widthPixels, 300);
	}
}



Спасибо за советы подсказки.
  • Вопрос задан
  • 11083 просмотра
Пригласить эксперта
Ответы на вопрос 4
Allesad
@Allesad
PVOID задал справедливый вопрос — зачем хранить в адаптере вьюшки? Это совершенно не рациональное использование ресурсов. По сути, все что вам нужно знать — тип текущего элемента листа. По этому типу вы можете устанавливать фон нужного цвета.

Пример:
1) Создаем статичный класс (опционально статичный, можно куда-нибудь запихать в нагрузку) со всеми цветами — скажем, ListColors.

public class ListColors {
    public static final Integer RED      = 0;
    public static final Integer GREEN    = 1;
    public static final Integer BLUE     = 2;
    public static final Integer YELLOW   = 3;
    public static final Integer PURPLE   = 4;
}


2) Создаем класс, описывающий элемент списка — ListItem. Тут важно свойство type, которое будет хранить тип элемента. А типом элемента будет любая из констант класса ListColors.

class ListItem {
    private Long id;
    private Integer type;

    public ListItem(Long id, Integer type){
        this.id     = id;
        this.type   = type;
    }

    public Long getId(){
        return id;
    }

    public Integer getType(){
        return type;
    }
}


3) Далее пишем сам адаптер, в конструктор которого будет передаваться Context (никогда не помешает) и список элементов в формате List<ListItem>.

class TestAdapter extends BaseAdapter implements ListAdapter {

    private Context context;
    private List<ListItem> items;

    public TestAdapter(Context context, List<ListItem> items){
        this.context    = context;
        this.items      = items;
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public ListItem getItem(int position) {
        return items.get(position);
    }

    @Override
    public long getItemId(int position) {
        return items.get(position).getId();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ListItem item = getItem(position);
        convertView = LayoutInflater.from(context).inflate(R.layout.list_row_item, null);

        LinearLayout layout = (LinearLayout) convertView.findViewById(R.id.view_background);

        Integer colorRes;
        switch (item.getType())
        {
            default:
            case ListColors.RED:
                colorRes = context.getResources().getColor(R.id.red);
                break;
            case ListColors.GREEN:
                colorRes = context.getResources().getColor(R.id.green);
                break;
            case ListColors.BLUE:
                colorRes = context.getResources().getColor(R.id.blue);
                break;
            case ListColors.YELLOW:
                colorRes = context.getResources().getColor(R.id.yellow);
                break;
            case ListColors.PURPLE:
                colorRes = context.getResources().getColor(R.id.purple);
                break;
        }
        layout.setBackgroundColor(colorRes);
        return convertView;
    }
}


В методе getView() мы получаем элемент списка, получаем базовый layot элемента списка (в данном случае типа LinearLayout), затем проверяем тип элемента и присваиваем layout'y нужный цвет. Можно еще хранить view элемента списка в holder'e, чтобы не создавать его каждый раз, но это частности.
Ответ написан
PVOID
@PVOID
Подсказка: BaseAdapter.getItemViewType(int position)

BTW, а почему вы в адаптере вьюшки храните?
Ответ написан
@s0llar
А почему бы не сохранять информацию о состоянии строки через settag/gettag?
Ответ написан
Комментировать
@amijko
@Override
 public View getView(int position, View convertView, ViewGroup parent) 
{
if (convertView == null)
{
convertView = LayoutInflater.from(context).inflate(R.layout.list_row_item, null);
//первое место где каждой вьюшке можно задать свой цвет, но она будет 
//переиспользоваться и появляться в разных местах при листаниии
}

int color = 0;
switch(position)
{
case 0:
color = 0xFFff0000;

case 1:
color = 0xFF00ff00;

case 2:
color = 0xFF0000ff;
}
//можно напридумывать миллион правил по которым будет генерить цвет так-то )
converView.setBackgroundColor(color);
return converView;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы