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





Для простого элемента в 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 большое спасибо!! На самом деле я просто работал над пользовательским ArrayAdapter для отображения некоторых элементов, но я продолжал сталкиваться с проблемой, из-за которой вместо отображения всех элементов он просто отображает 1. После исследования я понял, что это, вероятно, потому, что ArrayAdapter разрешает только 1 элемент. Можно ли отображать несколько элементов в списке с помощью RecyclerView?
@Cheesebaron, неважно, я только что понял, что он был завернут в плотную прокрутку, и я не мог видеть другие элементы, потому что я не знал, что могу просто прокрутить вниз .... чувствую себя очень глупо, ха-ха, спасибо за вашу помощь !! Также Джесси большое спасибо за ваш ответ!! :0
Вам нужно использовать адаптер. Они не обязательно такие сложные — см. документы для хорошего примера.