Android ListView с разными цветами - PullRequest
0 голосов
/ 17 октября 2011

У меня небольшая проблема с использованием разных цветов в ListView.

Я пробовал несколько вещей, но, похоже, ничего не работает

закрытый класс GameRowAdapter расширяет ArrayAdapter { Объекты ArrayList;

    public GameRowAdapter(Context context, int textViewResourceId, ArrayList<RowModel> objects) {
        super(context, textViewResourceId, objects);
        this.objects = objects;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        RowModelViews model;
        if (row == null) {
            LayoutInflater inflater = LayoutInflater.from(GamePlayerActivity.this);
            row = inflater.inflate(R.layout.game_line_layout, null);
            model = new RowModelViews();
            model.entry = (TextView) row.findViewById(R.id.gameLineEntry);
            model.score = (TextView) row.findViewById(R.id.gameLineEntryScore);
            row.setTag(model);
        } else {
            model = (RowModelViews) row.getTag();
        }

        if (position == 6 || position == 7) {
            row.setBackgroundColor(R.color.black);
        } else {
            row.setBackgroundColor(R.color.light_transparent);
        }

        model.entry.setText(objects.get(position).entry);
        model.score.setText(objects.get(position).score);

        return row;
    }
}

static class RowModelViews {
    TextView entry;
    TextView score;

}

static class RowModel {
    String entry;
    String score;

    public RowModel(String entry, String score) {
        this.entry = entry;
        this.score = score;
    }
}

Кто-нибудь, кто может сказать мне, что я делаю не так?

Спасибо.

UPDATE

Вот xml строки с надписью

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="horizontal">
    <TextView android:id="@+id/gameLineEntry"
              android:layout_height="fill_parent"
              android:layout_width="fill_parent"
              android:layout_marginLeft="20dp"
              android:textSize="20dp"
              android:gravity="center_vertical"/>
    <TextView android:id="@+id/gameLineEntryScore"
              android:layout_height="fill_parent"
              android:layout_width="65dp"
              android:layout_marginRight="20dp"
              android:gravity="center"
              style="@style/Button"                  
              android:layout_gravity="right"/>
</LinearLayout>

Ответы [ 2 ]

2 голосов
/ 17 октября 2011

Вы определяете цвет только при создании вида.Однако для переработанных видов вам нужно явно установить цвет заново.Нет гарантии, что 6 и 7 будут новыми взглядами.Поэтому всегда устанавливайте цвет представления при каждом вызове getView

0 голосов
/ 17 октября 2011

Редактировать: После выполнения небольшого локального теста, я думаю, проблема может заключаться в том, что TextViews, которые есть в каждой строке, находятся перед представлением строки ListView.Попробуйте установить цвета фона model.entry и model.score./ Edit

Я думаю, что это происходит из-за повторного использования convertViews.Попробуйте переместить это:

if (position == 6 || position == 7) {
    row.setBackgroundColor(R.color.black);
}

За пределами блока if (row == null) и замените его следующим образом:

if (position == 6 || position == 7) {
    model.entry.setBackgroundColor(R.color.black);
    model.score.setBackgroundColor(R.color.black);

} else {
    model.entry.setBackgroundColor(/*Whatever your default background color is*/);
    model.score.setBackgroundColor(/*Whatever your default background color is*/);
}

Таким образом, ваш полный метод getView будет:

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        RowModelViews model;
        if (row == null) {
            LayoutInflater inflater = LayoutInflater.from(GamePlayerActivity.this);
            row = inflater.inflate(R.layout.game_line_layout, null);
            model = new RowModelViews(row);
            model.entry = (TextView) row.findViewById(R.id.gameLineEntry);
            model.score = (TextView) row.findViewById(R.id.gameLineEntryScore);
            row.setTag(model);
        } else {
            model = (RowModelViews) row.getTag();
        }

        if (position == 6 || position == 7) {
            model.entry.setBackgroundColor(R.color.black);
            model.score.setBackgroundColor(R.color.black);
        } else {
            model.entry.setBackgroundColor(/*Whatever your default background color is*/);
            model.score.setBackgroundColor(/*Whatever your default background color is*/);
        }

        model.entry.setText(objects.get(position).entry);
        model.score.setText(objects.get(position).score);

        return row;
    }
...