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 5

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);
    }