Xamarin.Android: получение выбранного элемента ListView в AlertDialog - PullRequest
0 голосов
/ 15 марта 2019

Я создаю календарь в Xamarin.Android, который показывает вам календарь дат. При нажатии на дату он получает список событий в этот день для отображения в пользовательском адаптере в ListView, все в пределах AlertDialog.

Я хочу сделать так, чтобы, когда пользователь щелкает событие в списке, он извлекал информацию из этого события (в частности, URL-адрес веб-страницы события), а затем разрешал PositiveButton из * 1006. * открыть этот сайт с новым 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. Делая dialogView ListView и приведение inflater дает исключение 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();

Любая и вся помощь очень ценится.

1 Ответ

0 голосов
/ 15 марта 2019

Решил это.

В 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;
    }

Я пробовал это ранее, но получил нулевые ссылочные исключения,Я думал, что это думает, что адаптер или элементы были нулевыми, но мне просто нужно было охватить представление в dialogView, потому что он искал eventListView в макете Календаря, а не макет EventList.

...