андроид listview viewholder., когда использовать его, и если не к

У меня есть ListView с пользовательским адаптером списка. В getView () метод, использую ViewHolder 'шаблон' как показано в Образцах API для ListView14.java. Когда я сначала представляю список, это, кажется, загружается правильно. Однако проблема, с которой я сталкиваюсь, - то, что, когда я прокручиваю список, я вижу, что данные для списка обнаруживаются в неправильных строках (т.е. TextView, который должен быть последовательно 10, обнаруживается последовательно 2, например). Однако, когда я не использую viewholder и вместо этого называю findViewById () каждым разом, затем рендеринг представления списка правильно.

8
задан Ben 8 July 2010 в 23:50
поделиться

2 ответа

так что я думаю, что обнаружил здесь настоящую проблему. Когда вы задаете параметры макета для каждой строки "на лету", вам необходимо убедиться, что вы делаете это для всех условий. Моя проблема заключалась в том, что если бы это была первая строка, я установил параметр макета (например, заполнение или поля и т.д.), но тогда, если бы это была средняя строка, я явно не устанавливал эти параметры, думая, что он просто будет использовать то, что было раздутым по мнению надувного устройства. Это объясняет, почему это сработало, когда я каждый раз увеличивал изображение. Вот до и после:

ДО:

if (position == 0) {

            layoutParams.topMargin = uiHelper.getDip(15.0f);
            layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP,
                    RelativeLayout.TRUE);
            holder.actionMenu.setLayoutParams(layoutParams);

            holder.contentLayout.setBackgroundResource(R.drawable.top_row);

        } else if (position == posts.size() - 1) {
            holder.contentLayout
                    .setBackgroundResource(R.drawable.bottom_row);

            holder.contentLayout.setPadding(holder.contentLayout
                    .getPaddingLeft(),
                    holder.contentLayout.getPaddingTop(),
                    holder.contentLayout.getPaddingRight(),
                    holder.contentLayout.getPaddingBottom() +  uiHelper.getDip(10.0f));

        } else {
            holder.contentLayout
                    .setBackgroundResource(R.drawable.inner_row);
        }

ПОСЛЕ: `

            layoutParams.topMargin = uiHelper.getDip(10.0f);
        holder.contentLayout.setPadding(holder.contentLayout
                .getPaddingLeft(),
                holder.contentLayout.getPaddingTop(),
                holder.contentLayout.getPaddingRight(),
                uiHelper.getDip(10.0f));
        if (position == 0) {

            layoutParams.topMargin = uiHelper.getDip(15.0f);
            layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP,
                    RelativeLayout.TRUE);

            holder.contentLayout.setBackgroundResource(R.drawable.top_row);

        } else if (position == posts.size() - 1) {
            holder.contentLayout
                    .setBackgroundResource(R.drawable.bottom_row);

            holder.contentLayout.setPadding(holder.contentLayout
                    .getPaddingLeft(),
                    holder.contentLayout.getPaddingTop(),
                    holder.contentLayout.getPaddingRight(),
                    uiHelper.getDip(20.0f));

        } else {

            holder.contentLayout
                    .setBackgroundResource(R.drawable.inner_row);

        }

        holder.actionMenu.setLayoutParams(layoutParams);
1
ответ дан 5 December 2019 в 12:54
поделиться

Однако, проблема, с которой я столкнулся, заключается в том. что когда я прокручиваю список, я данные для списка отображаются в неправильных рядах (т.е. TextView который должен быть в строке 10, отображается например, в строке 2).

Скорее всего, вы неправильно перерабатываете свои строки, так что ViewHolders, которыми вы манипулируете, не соответствуют строкам, которые вы возвращаете.

Вот бесплатный отрывок из одной из моих книг, где более подробно рассказывается о переработке строк - возможно, это поможет вам определить, где все идет не так.

10
ответ дан 5 December 2019 в 12:54
поделиться
Другие вопросы по тегам:

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