Альтернативный фон для строк в ListFragment не работает при изменении размера строк
Я использую пользовательский ListFragment для отображения списка, в котором четные строки имеют фон, а нечетные - нет. Для этого я создал подкласс ArrayAdapter с переопределенным методом getView(int, View, ViewGroup) и установил фоновый ресурс для четных строк.
Это работало, но мне нужно было настроить размеры представлений, чтобы они были одинаковыми в строках с фоном и без него, поэтому я настроил параметры LayoutParams следующим образом:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
if ((position & 1) == 0) {
view.setBackgroundResource(R.drawable.marcador_wink_normal);
}
ViewGroup.LayoutParams params = view.getLayoutParams();
params.height = rowHeight;
view.setLayoutParams(params);
return view;
}
Я попробовал это, и это работало, пока я не прокрутил вниз, а затем вверх, что привело к фону, примененному к каждой строке.
У меня вопрос: что я делаю не так?
Я использую библиотеку поддержки v4 для фрагментов, и это метод onCreate(Bundle) моего пользовательского ListFragment:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int layout = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ?
android.R.layout.simple_list_item_activated_1 : android.R.layout.simple_list_item_1;
setListAdapter(new WinkAdapter(getActivity(), layout, TEST_LIST));
}
2 ответа
Представление, используемое для составления списка, используется повторно, когда оно не отображается на экране.
В исходном коде, если фон задан как R.drawable.marcador_wink_normal для данного представления, это навсегда был R.drawable.marcador_wink_normal. Когда вы добавили else, вы сделали так, чтобы он правильно устанавливал фон в этих повторно используемых представлениях.
Хорошо, я решил это, просто добавив оператор else:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
if ((position & 1) == 0) {
view.setBackgroundResource(R.drawable.marcador_wink_normal);
}
else {
view.setBackgroundColor(0);
}
ViewGroup.LayoutParams params = view.getLayoutParams();
params.height = 100;
view.setLayoutParams(params);
return view;
}
Но я до сих пор не понимаю, почему возникла проблема.