Я создаю календарь в Xamarin.Android, который показывает календарь дат. При нажатии на дату он захватывает список событий в этот день для отображения в пользовательском адаптере в ListView, все в AlertDialog.
Что я хочу сделать, так это сделать так, чтобы когда пользователь щелкает событие в списке, он собирал информацию об этом событии (в частности, URL-адрес веб-страницы события), а затем позволял PositiveButton из AlertDialog открывать этот сайт с помощью новый Activity.
У меня нет проблем с созданием AlertDialog и размещением ListView в нем и заполнением списка событиями. Я использовал код находится здесь с небольшими изменениями.
Я знаю, что событие выбрано, так как свойство android:listSelector в файле макета списка срабатывает, как и ожидалось. Однако я просто не могу понять, как получить доступ к событию щелчка или захватить позицию элемента, выбранного для доступа к его данным. В другом Activity, который является просто ListView, я просто делаю следующее:
HistoricSitesListView.ItemClick += HistoricSitesListView_ItemClick;
void HistoricSiesListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
{ code here }
Это отлично захватывает информацию для отдельных элементов этого списка. Но попытка сделать то же самое с объектом dialogView выдает ошибку View has no definition for ItemClick. Создание диалогового окна ListView и приведение инфлятора приводит к исключению InvalidCast.
Мой измененный код выглядит следующим образом:
View dialogView = LayoutInflater.Inflate(Resource.Layout.EventsListLayout, null);
AlertDialog alertDialog;
using (var dialog = new AlertDialog.Builder(this))
{
dialog.SetView(dialogView);
dialog.SetPositiveButton("More Info", (s, a) =>
{
if (currentEventURL != "null")
{
Intent eventIntent = new Intent(Intent.ActionView, Android.Net.Uri.Parse(currentEventURL));
StartActivity(eventIntent);
}
});
dialog.SetNegativeButton("Close", (s, a) => { });
alertDialog = dialog.Create();
}
var adapter = new EventModelAdapter(this, EventStringList);
dialogView.FindViewById<ListView>(Resource.Id.eventListView).Adapter = adapter;
dialogView.ItemClick += dialogView_ItemClick;
void dialogView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
EventModel clickedEvent = EventStringList[e.Position];
currentEventURL = clickedEvent.EventURL;
};
alertDialog.Show();
Любая помощь очень ценится.





Решил это.
В AlertDialog.Builder я сделал это:
dialog.SetView(dialogView);
EventListView = dialogView.FindViewById<ListView>(Resource.Id.eventListView);
а затем вне его,
EventListView.Adapter = adapter;
EventListView.ItemClick += EventListView_ItemClick;
void EventListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
currentEventURL = EventStringList[e.Position].EventURL;
}
Я пробовал это раньше, но получил исключения с нулевыми ссылками. Я думал, что он думает, что адаптер или элементы были нулевыми, но мне просто нужно было ограничить представление диалоговым окном, потому что оно искало eventListView в макете календаря, а не в макете EventList.