2016-09-16 2 views
0

Почему не срабатывает триггер события ItemClick?Почему не запущено событие ListView ItemClick?

_specialtyListView.ItemClick += (s, e) => _viewModel.Specialty = (string)_specialtyListView.Adapter.GetItem((int)e.Id); 

Примечание:

  1. элемент управления ListView заполняется.
  2. Товары получают фокус.

Однако я просто не могу получить событие itemclick для запуска.

У меня есть следующий код инициализации для моего ListView:

_specialtyListView = FindViewById<ListView>(Resource.Id.SpecialtyListView); 
_specialtyListView.ChoiceMode = ChoiceMode.Single; 
_viewModel.LoadSpecialties(); 
_specialtyListView.Adapter = new SpecialtiesAdapter(this, new List<string>(_viewModel.Specialties)); 
_specialtyListView.ItemClick += (s, e) => _viewModel.Specialty = (string)_specialtyListView.Adapter.GetItem((int)e.Id); 

Я тогда следующий ListViewItem расположение:

<ListView 
     android:id="@+id/SpecialtyListView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="10dp" 
     android:layout_marginTop="5dp" 
     android:background="@android:color/transparent" 
     android:cacheColorHint="@android:color/transparent" 
     android:divider="#CCCCCC" 
     android:dividerHeight="1dp" 
     android:paddingLeft="2dp" /> 

Вот макет для моего ListItem:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 
    <TextView 
     android:id="@+id/ProviderSpecialty" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="14sp" /> 
</LinearLayout> 

ответ

1

Я предлагаю вам переключиться на RecyclerView, поскольку у него улучшена обработка памяти; вы можете делать обновления для отдельных элементов, а не принудительно обновлять их все.

В любом случае, я не могу воспроизвести вашу проблему локально. Я сделал следующее:

var listView = FindViewById<ListView>(Resource.Id.listview); 
listView.ChoiceMode = ChoiceMode.Single; 
listView.ItemClick += (s, e) => 
{ 
    System.Diagnostics.Debug.WriteLine($"Clicked {e.Position}"); 
}; 

var items = new string[] { "Havarti", "Brie", "Cheddar", "Muenster", "Swiss" }; 
var adapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, items); 
listView.Adapter = adapter; 

Я использовал ту же самую компоновку, что и вы. Обработчик ItemClick попадает последовательно.

+0

ArrayAdapter работает для того, что мне нужно. Еще не знаю, почему мой пользовательский адаптер не работал ... –

+0

Если вы можете опубликовать свой пользовательский адаптер, я могу помочь вам отладить его. – Cheesebaron

+0

Прочитайте мое обновление для моего разрешения. –

0

Там есть ошибка, когда контрольная точка не будет срабатывать, когда код не завернутые в фигурных скобках:

listview.ItemClick += (s, e) => selectedItem = listview.GetItemAtPosition(e.Position).ToString(); 

Для наблюдения точки останова, я должен форматировать код, как:

listview.ItemClick += (s, e) => 
    { 
     selectedItem = listview.GetItemAtPosition(e.Position).ToString(); 
    }; 
+0

Это не ошибка. Ваша точка останова устанавливается для назначения обработчика событий в этом случае, а не для тела обработчика событий. – Cheesebaron

+0

В Visual Studio вы можете установить точку останова в строке, где сам обработчик может получить точку останова. Следовательно, вся строка не подсвечена коричневым цветом. Просто код обработчика подсвечен коричневым. Это не ошибка? –

Смежные вопросы