📄 src/Adapters/NoteListAdapter.cs
using Android.Views;
using AndroidX.RecyclerView.Widget;
using NotesApp.Models;

namespace NotesApp.Adapters;

public class NoteListAdapter(Action<NoteCacheEntry> onNoteTapped) : RecyclerView.Adapter
{
    private List<NoteCacheEntry> _items = [];

    public override int ItemCount => _items.Count;

    public void SetItems(List<NoteCacheEntry> items)
    {
        _items = items;
        NotifyDataSetChanged();
    }

    public NoteCacheEntry GetItem(int position) => _items[position];

    public void RemoveAt(int position)
    {
        _items.RemoveAt(position);
        NotifyItemRemoved(position);
    }

    public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
    {
        var view = LayoutInflater
            .From(parent.Context)!
            .Inflate(Resource.Layout.row_note, parent, false)!;
        return new NoteViewHolder(view, onNoteTapped);
    }

    public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position) =>
        ((NoteViewHolder)holder).Bind(_items[position]);

    private class NoteViewHolder : RecyclerView.ViewHolder
    {
        private readonly TextView _nameView;
        private readonly TextView _previewView;
        private readonly Action<NoteCacheEntry> _onNoteTapped;
        private NoteCacheEntry? _item;

        public NoteViewHolder(View itemView, Action<NoteCacheEntry> onNoteTapped)
            : base(itemView)
        {
            _nameView = itemView.FindViewById<TextView>(Resource.Id.note_name)!;
            _previewView = itemView.FindViewById<TextView>(Resource.Id.note_preview)!;
            _onNoteTapped = onNoteTapped;
            itemView.Click += (_, _) =>
            {
                if (_item != null)
                    _onNoteTapped(_item);
            };
        }

        public void Bind(NoteCacheEntry entry)
        {
            _item = entry;
            _nameView.Text = entry.Name;
            _previewView.Text = entry.Preview;
        }
    }
}