У меня есть ListView с пользовательским адаптером списка. В getView () метод, использую ViewHolder 'шаблон' как показано в Образцах API для ListView14.java. Когда я сначала представляю список, это, кажется, загружается правильно. Однако проблема, с которой я сталкиваюсь, - то, что, когда я прокручиваю список, я вижу, что данные для списка обнаруживаются в неправильных строках (т.е. TextView, который должен быть последовательно 10, обнаруживается последовательно 2, например). Однако, когда я не использую viewholder и вместо этого называю findViewById () каждым разом, затем рендеринг представления списка правильно.
так что я думаю, что обнаружил здесь настоящую проблему. Когда вы задаете параметры макета для каждой строки "на лету", вам необходимо убедиться, что вы делаете это для всех условий. Моя проблема заключалась в том, что если бы это была первая строка, я установил параметр макета (например, заполнение или поля и т.д.), но тогда, если бы это была средняя строка, я явно не устанавливал эти параметры, думая, что он просто будет использовать то, что было раздутым по мнению надувного устройства. Это объясняет, почему это сработало, когда я каждый раз увеличивал изображение. Вот до и после:
ДО:
if (position == 0) {
layoutParams.topMargin = uiHelper.getDip(15.0f);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP,
RelativeLayout.TRUE);
holder.actionMenu.setLayoutParams(layoutParams);
holder.contentLayout.setBackgroundResource(R.drawable.top_row);
} else if (position == posts.size() - 1) {
holder.contentLayout
.setBackgroundResource(R.drawable.bottom_row);
holder.contentLayout.setPadding(holder.contentLayout
.getPaddingLeft(),
holder.contentLayout.getPaddingTop(),
holder.contentLayout.getPaddingRight(),
holder.contentLayout.getPaddingBottom() + uiHelper.getDip(10.0f));
} else {
holder.contentLayout
.setBackgroundResource(R.drawable.inner_row);
}
ПОСЛЕ: `
layoutParams.topMargin = uiHelper.getDip(10.0f);
holder.contentLayout.setPadding(holder.contentLayout
.getPaddingLeft(),
holder.contentLayout.getPaddingTop(),
holder.contentLayout.getPaddingRight(),
uiHelper.getDip(10.0f));
if (position == 0) {
layoutParams.topMargin = uiHelper.getDip(15.0f);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP,
RelativeLayout.TRUE);
holder.contentLayout.setBackgroundResource(R.drawable.top_row);
} else if (position == posts.size() - 1) {
holder.contentLayout
.setBackgroundResource(R.drawable.bottom_row);
holder.contentLayout.setPadding(holder.contentLayout
.getPaddingLeft(),
holder.contentLayout.getPaddingTop(),
holder.contentLayout.getPaddingRight(),
uiHelper.getDip(20.0f));
} else {
holder.contentLayout
.setBackgroundResource(R.drawable.inner_row);
}
holder.actionMenu.setLayoutParams(layoutParams);
Однако, проблема, с которой я столкнулся, заключается в том. что когда я прокручиваю список, я данные для списка отображаются в неправильных рядах (т.е. TextView который должен быть в строке 10, отображается например, в строке 2).
Скорее всего, вы неправильно перерабатываете свои строки, так что ViewHolders
, которыми вы манипулируете, не соответствуют строкам, которые вы возвращаете.
Вот бесплатный отрывок из одной из моих книг, где более подробно рассказывается о переработке строк - возможно, это поможет вам определить, где все идет не так.