Так как вы используете шаблон Viewholder и перезапускаете представления, вы в итоге получаете беспорядок.
Это связано с тем, что в вашем списке есть два разных вида представлений, и когда вы получите convertview, это будет одно из этих представлений.
Представьте набор данных A с компоновкой / представлением a и такой же для B b
(- B- означает, что пока не отображается на экране)
Таким образом, если ваш начальный список Aa, Bb, Bb, Aa, -B-, -B- и вы прокручиваете, чтобы внести данные B в список ... Тогда вы получите конвертированное представление с макетом или макет ИЛИ b, таким образом, не имея возможности Надежно использовать convertview.
Я занимаюсь поиском способа поддержки различных представлений в ListView и в то же время использую шаблон convertView / viewHolder. До сих пор я нашел этот вариант интересным: https://github.com/commonsguy/cwac-merge#readme
То, что вы хотите сделать, это переопределить getItemViewType (position).
Вот пример. Конечно, у вас есть dataTypes вместо MoreResultsLoader и YPContact.
@Override
public int getItemViewType(int position) {
if (resultsList.get(position) instanceof MoreResultsLoader) {
return VIEW_TYPE_MORE_RESULTS_LOADER;
}
if (resultsList.get(position) instanceof YPContact) {
YPContact ypCon = (YPContact) resultsList.get(position);
if(checkForGold(ypCon))
return VIEW_TYPE_YPCONTACT_GOLD;
else
return VIEW_TYPE_YPCONTACT_REG;
}
}
Затем в getView вам нужно будет проверить, с каким типом представления вы имеете дело, и наполнить / заполнить правильным классом ViewHolder.
public View getView(final int position, View convertView, ViewGroup parent) {
View ourView = convertView;
int itemViewType = getItemViewType(position);
switch (itemViewType) {
case VIEW_TYPE_MORE_RESULTS_LOADER:
MoreResultsViewHolder moreResVH = null;
if (ourView == null) {
ourView = layoutInflator.inflate(R.layout.load_more_items,
null, true);
moreResVH = new MoreResultsViewHolder(ourView);
ourView.setTag(moreResVH);
} else {
moreResVH = (MoreResultsViewHolder) ourView.getTag();
}
if (moreResVH != null) {
moreResVH.populate((MoreResultsLoader) resultsList
.get(position), context);
}
return ourView;
case VIEW_TYPE_YPCONTACT_GOLD:
ContactViewHolderGold contactVHGold = null;
if (ourView == null) {
ourView = layoutInflator.inflate(
R.layout.yp_search_result_list_item_gold, null, true);
contactVHGold = new ContactViewHolderGold(ourView);
ourView.setTag(contactVHGold);
} else {
contactVHGold = (ContactViewHolderGold) ourView.getTag();
}
if (contactVHGold != null) {
final YPContact ypContact = (YPContact) resultsList
.get(position);
contactVHGold.populate(ypContact, mCurrentLocation,
ypSearchResultsActivity);
// moreResVH.populate(
// (MoreResultsLoader)resultsList.get(position),context);
}
return ourView;