在 mvvmcross 中滑动以删除回收视图中的项目

remove a item in a recyclerview with swipe in mvvmcross

我创建了一个带有滑动的 MvxRecyclerview,我需要删除 recyclerview 的滑动项,但是当我进行滑动时,删除该项目,然后在 recyclerview 的底部出现另一个项目。

Nombre.cs

public class Nombre
{
    public string _name;
    public string name
    {
        get { return _name; }
    }
}

RecyclerViewModel.cs

public class RecyclerViewModel : BaseViewModel
{
    //private IList<Nombre> Items;
    NombreGenesisService lista;

    public RecyclerViewModel()
    {
        //Nombres lista = new Nombres();
        lista = new NombreGenesisService();

        Items = new List<Nombre>
        {
            new Nombre()
            {
                _name = "sebastian",
            },

             new Nombre()
            {
                _name = "Natalia",
            },

            new Nombre()
            {
                _name = "Angelica",
            },
            new Nombre()
            {
                _name = "Octavio",
            },
        };
    }

    private List<Nombre> _items;

    public List<Nombre> Items
    {
        get { return _items; }
        set
        {
            _items = value;
            RaisePropertyChanged(() => Items);
        }
    }
}

}

RecyclerViewFragment.cs

public class RecyclerViewFragment : BaseFragment<RecyclerViewModel>
{
    protected override int FragmentId
    {
        get
        {
            return Resource.Layout.fragment_example_recyclerview;
        }
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        var ignore = base.OnCreateView(inflater, container, savedInstanceState);

        var recyclerView = ignore.FindViewById<MvxRecyclerView>(Resource.Id.my_recycler_view);

        if (recyclerView != null)
        {
            recyclerView.HasFixedSize = true;
            var layoutManager = new LinearLayoutManager(Activity);
            recyclerView.SetLayoutManager(layoutManager);

            ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(recyclerView.GetAdapter());
            ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback);
            itemTouchHelper.AttachToRecyclerView(recyclerView);
            recyclerView.SetItemAnimator(new DefaultItemAnimator());
        }

        return ignore;
    }

    public override void OnDestroyView()
    {
        base.OnDestroyView();

    }
}

SimpleItemTouchHelperCallback.cs

class SimpleItemTouchHelperCallback : ItemTouchHelper.Callback
{
    // private RecyclerView.Adapter adapter;
    private readonly RecyclerView.Adapter _adapter;
    RecyclerViewModel lista;
    NombreGenesisService lista2;
    public SimpleItemTouchHelperCallback(RecyclerView.Adapter adapter)
    {
        _adapter = adapter;
        lista = new RecyclerViewModel();
    }

    public override int GetMovementFlags(RecyclerView p0, RecyclerView.ViewHolder p1)
    {
        int dragFlags = ItemTouchHelper.Up | ItemTouchHelper.Down;
        int swipeFlags = ItemTouchHelper.Start | ItemTouchHelper.End;
        return MakeMovementFlags(dragFlags, swipeFlags);
    }

    public override bool OnMove(RecyclerView p0, RecyclerView.ViewHolder p1, RecyclerView.ViewHolder p2)
    {
        _adapter.NotifyItemMoved(p1.AdapterPosition, p2.AdapterPosition);
        return true;
    }

    public override void OnSwiped(RecyclerView.ViewHolder p0, int p1)
    {
        lista.Items.RemoveAt(p0.AdapterPosition);
        _adapter.NotifyItemRemoved(p0.AdapterPosition);
    }

}

fragment_example_recyclerview.axml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<MvxRecyclerView
    android:id="@+id/my_recycler_view"
    android:scrollbars="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#CCCCCC"
    local:MvxBind="ItemsSource Items;"
    local:MvxItemTemplate="@layout/item_name" />

如果我没记错的话,您似乎正在为您的 Fragment 创建一个 ViewModel,并在其构造函数中为您的 RecyclerView 创建一个新的 ViewModel。然后您只需删除 RecyclerView 中 ViewModel 的项目。

也许尝试将您的 ViewModel 从 Fragment 传递到您的 RecyclerView,尽管这似乎不是一个可行的好方法。以后我可能会尝试为自己找到更好的解决方案。