#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);
...