Intereting Posts
Эквивалент RelativeLayout в Flutter Обновление расширяемого уведомления, повторное его расширение, даже после того, как пользователь свернул его Как добавить параметры в HttpURLConnection с помощью POST Как остановить навигацию по ActionBar Tab для отображения в качестве счетчика, когда он становится слишком длинным? Прокрутка SwipeRefreshLayout с помощью RecyclerView Обновить в любом месте Android 2.2 Recyclerview внутри вложенного просмотра прокрутки, загружая все данные вместо вызова по одному изображению при прокрутке Как переключиться с по умолчанию ConstraintLayout на RelativeLayout в Android Studio 2.3.3 Анализ XMl в Android с помощью Xpath Тестирование ActiveAndroid с помощью Robolectric Выравнивание drawableLeft с текстом кнопки Android UI Design: интерактивные элементы ListView Ошибка теста Espresso: AppNotIdleException Google Кошелек: нет доступных форм оплаты Как открыть файлы MS Office в Android Mortar + Flow с сторонними библиотеками, подключенными к жизненному циклу активности

SetOnItemClickListener в ListView, влияющий на несколько строк

У меня есть пользовательский список и пользовательский адаптер. При щелчке по строке этого списка текст TextView установлен на белый, а фон этой строки имеет черный цвет.

Все хорошо, но при нажатии строки другие строки имеют цвет фона, установленный на черный, и при прокрутке вверх и вниз все испортится.

GetView () в пользовательском адаптере

public View getView(final int position, View convertView, ViewGroup parent) { final ListItem holder; View vi=convertView; if(vi==null){ vi = inflater.inflate(R.layout.list, null); holder = new ListItem(); holder.nametext= (TextView) vi.findViewById(R.id.name); vi.setTag(holder); }else{ holder = (ListItem) vi.getTag(); } holder.nametext.setText(""+item.name); return vi; } 

В mainactivity:

 CustomAdapter listadapter = new CustomAdapter(context, R.layout.list, items); list.setAdapter(listadapter); list.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapter, View view, int position, long arg){ TextView v = (TextView) view.findViewById(R.id.name); view.setBackgroundColor(Color.BLACK); v.setTextColor(Color.WHITE); } }); 

Я попробовал puttin setOnItemClickListener в getView (), но не повезло …

Любая помощь? Благодарю.

Пользовательские списки видят «создать» представление только для показа строк, когда прокрутка вниз следующей строки будет затронута, как первая.

Чтобы предотвратить эту проблему, вам нужно создать логическое поле в ListItem Clicked;

Затем, щелкнув представление, item.Clicked устанавливается в true, где в getView ()

 final ListItem item = items.get(position); 

а также

 List<ListItem> items; 

Как переменная вашего адаптера

Реализация:

Вам нужно установить setOnClickListener в getView (), как показано ниже

 vi.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg1) { if(previousView!=null){ ListItem previousItem = items.get(previousPosition); previousItem.Clicked = false; } item.Clicked = true; previousView = arg1; previousPosition = position; notifyDataSetChanged(); } }); if(!item.isClicked){ holder.nametext.setTextColor(Color.BLACK); vi.setBackgroundColor(Color.WHITE); }else{ holder.nametext.setTextColor(Color.WHITE); vi.setBackgroundColor(Color.BLACK); } }); 

Это эффект по умолчанию, связанный с отображением списка кеша, который можно избежать, установив свойство «android: cacheColorHint» на @null, как это

 <ListView android:id="@+id/lstEventComment" android:layout_width="match_parent" android:layout_height="wrap_content" android:cacheColorHint="@null" />