BaseAdapter возвращает неправильную позицию при вызове метода getView()
Как ни странно, мой CustomBaseAdapter
возвращает неверное положение для элемента, который должен быть надут, и так далее адаптер принимает неверные данные для отображения в строке!
Хотя я использую шаблон ViewHolder
, Мой ListView layout_height
установлен в match_parent
, и все возможные способы, которые я нашел, чтобы обеспечить стабильность элементов ListView, уже реализованы, CustomBaseAdapter
, кажется, не реагирует на него.
GetView () метод
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
mItemView = convertView;
if (convertView == null) {
mItemView = mInflater.inflate(R.layout.layout_listview_row, parent, false);
holder = new ViewHolder();
//setting up the Views
mItemView.setTag(holder);
} else {
holder = (ViewHolder) mItemView.getTag();
}
//Getting the item
final MyItem item = getItem(position);
//Doing some checks on my item and then display the appropriate data.
//By saying checks i mean something like:
if(item.getSomething().equals("blabla")){
//Load some pic
}else{
//Load another pic
}
//Now when i have scrolled the list once and return back to top,
//Suddenly in Logcat i am seeing that the first row is getting matched to
//the object in the 4th position, but it doesnt display its data. It displays
//the text from the first item as it was supposed to do. But the relation between
//the first row and the item's position is like 0->4.
}
Другое методы
@Override
public int getCount() {
return this.mObjects.size();
}
@Override
public MyItem getItem(int position) {
return this.mObjects.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
Я буквально искал и пробовал все в Google! Кажется, ничто не дало мне решения.
Любая помощь будет оценена! Дайте мне знать, если вам понадобится еще какая-нибудь часть кода.
2 ответа:
Я подозреваю, что
mItemView
является здесь виновником. Судя по названию, это поле экземпляра, поэтому, если более чем один поток вызываетgetView()
в вашемCustomBaseAdapter
, тоmItemView
может изменить, на какой переработанный вид он указывает прямо у вас под носом. Кроме того, я предполагаю, чтоgetView()
заканчивается наreturn mItemView
, верно?В любом случае, я бы посоветовал попробовать исключить
mItemView
и просто написать функцию так:@Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = mInflater.inflate(R.layout.layout_listview_row, parent, false); ViewHolder holder = new ViewHolder(); //setting up the Views convertView.setTag(holder); } ViewHolder holder = (ViewHolder) convertView.getTag(); // ... return convertView; }
Вы" утилизируете " объекты отображения, но вы несете ответственность за получение в них надлежащих данных. Проблема заключается в следующей строке кода:
mItemView = convertView;
convertView
является "контейнером" для ваших данных. ЕслиconvertView
не равно null, то контейнер будет построен, но затем вы должны поместить в него соответствующие данные. Обычно это делается с помощью индикатора позиции.Может быть, так:
if (convertView == null) { mItemView = mInflater.inflate(R.layout.layout_listview_row, parent, false); holder = new ViewHolder(); //setting up the Views mItemView.setTag(holder); } else { holder = getItem(position); mItemView.setTag(holder); }