Неправильный номер позиции в ListView

#android #listview #position

#Android #listview #позиция

Вопрос:

Я сталкивался с этой проблемой несколько раз, и хотя я не могу ее решить

вот код из адаптера

     public View getView(final int position, View convertView, ViewGroup parent) {


        if(convertView == null){
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.place_item_layout, parent, false);
            //HERE's my check
            (convertView.findViewById(R.id.divdePlaces)).setVisibility(View.GONE);
            if (place.isTOP()==false amp;amp; position!=0) if (places.get(position-1).isTOP()==true) {
                //turn back on
                (convertView.findViewById(R.id.divdePlaces)).setVisibility(View.VISIBLE);   
            }

.. etc..

}
return convertView;
}
  

Итак, это просто включает разделительную строку, если выполняются условия. Я думал, что здесь позиция должна быть действительным числом, но она повторяется снова, когда ListView переходит на 1 экран вверх, даже если условия для этого точно не выполнены.

Как мне это исправить?

введите описание изображения здесь

введите описание изображения здесь

Комментарии:

1. Что это за функция isTOP, которую вы вызываете? Кроме того, вы когда-нибудь устанавливали вид обратно на НЕВИДИМЫЙ в случае прокрутки? Помните, что представления используются повторно, И ВСЕ видимости, тексты и т. Д. Пользовательского интерфейса Должны быть полностью установлены при каждом вызове getView

2. @GabeSechan Есть ли правильный справочный вопрос по вопросам утилизации ListView? Я пока не нашел его, и я подумывал о том, чтобы написать его, но, поскольку вы здесь дольше, может быть, вы уже знаете об этом?

3. @matiash Я понятия не имею, я не обращаю особого внимания на справочные вопросы. Я знаю, что на это уже отвечали раньше, я и другие. Вероятно, вы можете немного покопаться и найти хороший. Кроме того, несколько лет назад было отличное видео от Google I / O о том, как работают ListViews, на него может быть полезно сослаться.

Ответ №1:

При прокрутке на одну страницу вверх ваши представления начинают перерабатываться. Следовательно, convertView уже раздут и не равен нулю. Переключите видимость разделителя за пределами блока if (convertView== null).

Что-то вроде этого:

 public View getView(final int position, View convertView, ViewGroup parent)
{


    if(convertView == null)
    {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService Context.LAYOUT_INFLATER_SERVICE);

        convertView = inflater.inflate(R.layout.place_item_layout, parent, false);
    }

    int visibility = (place.isTOP()==false amp;amp; position!=0) ? View.GONE : View.VISIBLE;
    convertView.findViewById(R.id.divdePlaces).setVisibility(visibility);

    return convertView;

}
  

Ответ №2:

Эта проблема возникает из-за повторного использования представления ListView . При прокрутке вниз представления элементов, которые выходят сверху, повторно используются (предоставляются как convertView ) для новых элементов. Поэтому вам нужно убедиться, что вы «отменяете настройки», если они больше не применяются.

Например:

 if (convertView == null)
{
     // create new view.
     convertView = inflater.inflate(...);
}

// OUTSIDE the previous if, and with both branches implemented.
if (check)
     (convertView.findViewById(R.id.divdePlaces)).setVisibility(View.VISIBLE);   
else
     (convertView.findViewById(R.id.divdePlaces)).setVisibility(View.GONE);   

...