wrewolf
@wrewolf

Почему каша из строк в ListView во время обновления элементов в списке?

При быстром скроле вниз вверх начинает свистопляска, вплоть до того что все элементы в списке сначала начинает ездить друг по другу в 2-3 слоя, а затем если продолжать скролить вообще пропадают и скролбар исчезает, пока все элементы заново не прогрузятся, как будто он не может рассчитать высоту элемента, хотя она не может быть меньше некой константы.

При использовании такого кода, при том viewHolder не влияет, так было до его введения.
if (convertView == null) {
  convertView = ((LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.custom_row, null);
  viewHolder = new ViewHolder();
  viewHolder.status = (TextView) convertView.findViewById(R.id.status);
  viewHolder.dinamic_content = (LinearLayout) convertView.findViewById(R.id.dinamic_content);
  convertView.setTag(viewHolder);
} else {
    viewHolder = (ViewHolder) convertView.getTag();
    viewHolder.dinamic_content.removeAllViews();
}


если всегда делать
convertView = ((LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.custom_row, null);

то такой проблемы нет.
  • Вопрос задан
  • 348 просмотров
Решения вопроса 1
Ewintory
@Ewintory
Java / Android developer
Для начала лучше сохранить один раз Inflater в контрукторе адаптера
private LayoutInflater mInflater;
...
mInflater = LayoutInflater.from(context);


Затем попробуйте вот такую конструкцию, переделав ее под себя
@Override public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.sort_spinner_item, parent, false);
            holder = new ViewHolder(convertView);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.textView.setText(getTitle(position));       

        return convertView;
    }

public static class ViewHolder {
        @InjectView(android.R.id.text1) TextView textView;

        public ViewHolder(View view) {
            ButterKnife.inject(this, view);
            view.setTag(this);
        }
    }


Кажется проблема в том что используете
convertView = mInflator.inflate(R.layout.custom_row, null);

вместо
convertView = mInflator.inflate(R.layout.custom_row, parent, false );
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
wrewolf
@wrewolf Автор вопроса
Не долго радовался ровному скролу как началось опять перемешивание. Но, таким образом вообще начало проглатывать элементы, и в теле списка крутит по нескольку раз элементы.
Хотя это виновато кеширование.

после создания вьюшки делаю так.
views.put(item.getId(), new WeakReference<>(convertView));

При отключенном кеширование работает 100% верно, но появляется подергивание из-за перезагрузки содержимого карточки. Надо попробовать содержимое положить в кеш и отрисовывать без его подгрузки из источника
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы