2014-12-05 4 views
4

Как ни странно, мой CustomBaseAdapter возвращает неправильную позицию для элемента, который необходимо раздуть, и поэтому адаптер берет неверный вид данных для отображения в строке!BaseAdapter возвращает неправильное положение при вызове метода getView()

Хотя я использую 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! Кажется, ничего не дало мне решения.

Любая помощь будет оценена! Дайте мне знать, если вам нужна дополнительная часть кода.

+0

взглянуть здесь ... да я знаю, что это 1 час, но стоит ... https://www.youtube.com/watch?v=wDBM6wVEO70 – Selvin

+0

Я уже смотрел его, но не мог понять, что я делаю неправильно! – Pavlos

+0

Да, я исправил это, но давая -1 только потому, что вы догадываетесь, что я могу сделать какую-то глупую проверку, это не так справедливо. В любом случае ... – Pavlos

ответ

1

Я подозреваю, что 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; 
} 
+1

«Кроме того, я предполагаю, что getView() заканчивается возвратом mItemView, верно?» Это вроде меня спасло много времени, и эта модель странно работает снова без перерисовок + некоторые другие изменения, которые я сделал при загрузке адаптера! Я принимаю ответ и благодарю вас! – Pavlos

2

Вы «перерабатываете» объекты дисплея, но вы несете ответственность за получение правильных данных в них. Проблема заключается эта строка кода:

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

Почему я должен сделать держатель равным элементу в выбранной позиции? Можете ли вы объяснить цель владельца = getItem (позиция); – Pavlos

+0

@Selvin: Какая у вас точка? И как я должен передавать правильные данные, если элемент повторно используется? – Pavlos

+0

Я имел в виду: этот код не имеет смысла, но первая часть об утилизации верна – Selvin

Смежные вопросы