Есть ли эквивалент ListView.ItemsSource в xamarin.android?

Я работаю над проектом xamarin.android, где мне нужно связать список компонентов с представлением списка макетов, чтобы отобразить этот список компонентов. После некоторых исследований я обнаружил, что для этого вам нужен какой-то адаптер, и кажется, что есть много кода, связанного с созданием адаптера для отображения некоторого списка в списке. Я знаю, что в xamarin.forms есть свойство ItemsSource ListView, которое упрощает жизнь, есть ли что-то подобное в xamarin.android? Я новичок во всем этом, поэтому, если я что-то упустил, извините. Заранее спасибо!

Вам нужно использовать адаптер. Они не обязательно такие сложные — см. документы для хорошего примера.

Jason 04.04.2022 02:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для простого элемента в Listview вы можете обратиться к документу Заполнение Xamarin.Android ListView данными, как упомянул Джейсон. Отображаемые элементы представляют собой простой список строк.

Если вы хотите настроить внешний вид ListView так, как показано на следующем рисунке, вы можете обратиться к документу Настройка внешнего вида ListView с помощью Xamarin.Android.

Для этого вы можете сослаться на документ Настройка внешнего вида ListView с помощью Xamarin.Android.

Шаги:

1. Добавление ListView в макет действия

<ListView android:id = "@+id/List"
    android:layout_width = "fill_parent"
    android:layout_height = "fill_parent"
    android:cacheColorHint = "#FFDAFF7F"
/>

2. Создание пользовательского макета строки

Другой файл макета AXML необходим для содержания пользовательского макета для каждой строки, которая будет отображаться в представлении списка.

<?xml version = "1.0" encoding = "utf-8"?>
<RelativeLayout  xmlns:android = "http://schemas.android.com/apk/res/android"
   android:layout_width = "fill_parent"
   android:layout_height = "wrap_content"
   android:background = "#FFDAFF7F"
   android:padding = "8dp">
    <LinearLayout android:id = "@+id/Text"
       android:orientation = "vertical"
       android:layout_width = "wrap_content"
       android:layout_height = "wrap_content"
       android:paddingLeft = "10dip">
        <TextView
         android:id = "@+id/Text1"
         android:layout_width = "wrap_content"
         android:layout_height = "wrap_content"
         android:textColor = "#FF7F3300"
         android:textSize = "20dip"
         android:textStyle = "italic"
         />
        <TextView
         android:id = "@+id/Text2"
         android:layout_width = "wrap_content"
         android:layout_height = "wrap_content"
         android:textSize = "14dip"
         android:textColor = "#FF267F00"
         android:paddingLeft = "100dip"
         />
    </LinearLayout>
    <ImageView
        android:id = "@+id/Image"
        android:layout_width = "48dp"
        android:layout_height = "48dp"
        android:padding = "5dp"
        android:src = "@drawable/icon"
        android:layout_alignParentRight = "true" />
</RelativeLayout >

3. Ссылка на пользовательское представление строки

Реализация примера пользовательского адаптера находится в HomeScreenAdapter.cs. Ключевым методом является GetView, когда он загружает пользовательский AXML, используя идентификатор ресурса Resource.Layout.CustomView, а затем устанавливает свойства для каждого из элементов управления в представлении перед его возвратом. Показан полный класс адаптера (TableItem — модель элемента):

public class HomeScreenAdapter : BaseAdapter<TableItem> {
   List<TableItem> items;
   Activity context;
   public HomeScreenAdapter(Activity context, List<TableItem> items)
       : base()
   {
       this.context = context;
       this.items = items;
   }
   public override long GetItemId(int position)
   {
       return position;
   }
   public override TableItem this[int position]
   {
       get { return items[position]; }
   }
   public override int Count
   {
       get { return items.Count; }
   }
   public override View GetView(int position, View convertView, ViewGroup parent)
   {
       var item = items[position];
       View view = convertView;
       if (view == null) // no view to re-use, create new
           view = context.LayoutInflater.Inflate(Resource.Layout.CustomView, null);
       view.FindViewById<TextView>(Resource.Id.Text1).Text = item.Heading;
       view.FindViewById<TextView>(Resource.Id.Text2).Text = item.SubHeading;
       view.FindViewById<ImageView>(Resource.Id.Image).SetImageResource(item.ImageResourceId);
       return view;
   }
}

4. Ссылка на пользовательский ListView в действии

ListView listView;

SetContentView(Resource.Layout.HomeScreen); // loads the HomeScreen.axml as this activity's view
listView = FindViewById<ListView>(Resource.Id.List); // get reference to the ListView in the layout

// populate the listview with data
listView.Adapter = new HomeScreenAdapter(this, tableItems);
listView.ItemClick += OnListItemClick;  // to be defined

void OnListItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
   var listView = sender as ListView;
   var t = tableItems[e.Position];
   Android.Widget.Toast.MakeText(this, t.Heading, Android.Widget.ToastLength.Short).Show();
}

Вы можете получить полный образец здесь: https://github.com/xamarin/monodroid-samples/tree/main/CustomRowView.

Наряду с кодом Джесси здесь я настоятельно рекомендую вместо этого использовать RecyclerView, так как вы получаете шаблон ViewHolder из коробки, и он намного эффективнее использует память. С кодом, который предлагает Джесси, вы быстро столкнетесь с проблемами с большим количеством элементов в вашем списке. Это видео Xamarin University, хотя оно и устарело, все еще актуально и является отличным ресурсом по RecyclerViews: youtube.com/watch?v=GRsJ8fXHVGA

Cheesebaron 04.04.2022 08:14

@Cheesebaron большое спасибо!! На самом деле я просто работал над пользовательским ArrayAdapter для отображения некоторых элементов, но я продолжал сталкиваться с проблемой, из-за которой вместо отображения всех элементов он просто отображает 1. После исследования я понял, что это, вероятно, потому, что ArrayAdapter разрешает только 1 элемент. Можно ли отображать несколько элементов в списке с помощью RecyclerView?

Mary 04.04.2022 08:26

@Cheesebaron, неважно, я только что понял, что он был завернут в плотную прокрутку, и я не мог видеть другие элементы, потому что я не знал, что могу просто прокрутить вниз .... чувствую себя очень глупо, ха-ха, спасибо за вашу помощь !! Также Джесси большое спасибо за ваш ответ!! :0

Mary 04.04.2022 08:42

Другие вопросы по теме