Xamarin.Android 如何记住 recyclerview 中项目的位置

Xamarin.Android how to remember the position of items in a recyclerview

我根据 link

中的代码在 xamarin.android 中设置了一个 recyclerview

https://www.appliedcodelog.com/2019/08/reorder-list-items-by-drag-and-drop-in.html

我的问题是,当应用程序重新启动等时,我如何记住这些项目的位置。当用户添加项目时,它们被插入到适配器位置 0、1、2、3 等,但是当他们关闭应用程序时然后回来,它并不总是以相同的顺序。

用户还可以通过拖放重新排列,这似乎增加了更多的混乱!

目前,我通过将列表转换为 Json 并在应用程序再次打开时加载来保存 recyclerview 中的项目,但正如我所说,这些项目并不总是与之前的顺序相同应用程序已关闭。

任何人都可以建议最好的方法吗?我试图将项目名称和位置编号添加到转换为 json 的列表中,然后尝试将项目插入保存的位置索引但无法使其工作..

谢谢

你想达到如下GIF效果吗?

您可以使用 PreferenceManagerrecyclerview 中存储项目的位置(在存储数据之前,我将序列化数据)。

您可以覆盖OnPause()方法,该方法将在应用程序后台或应用程序被杀死时执行。所以我们可以在这个 method.Here 中存储位置和数据是关于 ReOrderActivity

的代码
   [Activity(Label = "ReOrderList")]
    public class ReOrderActivity : Activity, IOnStartDragListener
    { 
        private ItemTouchHelper _mItemTouchHelper;
        public static ObservableCollection<string> ResourceList;
        private RecyclerView _resourceReorderRecyclerView;
        ReOrderAdapters resourceAdapter;
        ISharedPreferences prefs;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.ReOrderLayout);
            prefs = PreferenceManager.GetDefaultSharedPreferences(this);
            GetCollection();

             resourceAdapter = new ReOrderAdapters(ResourceList, this);

            // Initialize the recycler view.
            _resourceReorderRecyclerView = FindViewById<RecyclerView>(Resource.Id.ResourceReorderRecyclerView);

            Button mDone = FindViewById<Button>(Resource.Id.mDone);
            mDone.Click += MDone_Click;
            _resourceReorderRecyclerView.SetLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.Vertical, false));
            _resourceReorderRecyclerView.SetAdapter(resourceAdapter);
            _resourceReorderRecyclerView.HasFixedSize = true; 

            ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(resourceAdapter);
            _mItemTouchHelper = new ItemTouchHelper(callback);
            _mItemTouchHelper.AttachToRecyclerView(_resourceReorderRecyclerView);
        }
        protected override void OnPause()
        {
            base.OnPause();
            string ConvertData = JsonConvert.SerializeObject(ResourceList);
            ISharedPreferencesEditor editor = prefs.Edit();
            editor.PutString("ObservableCollection_ConvertData", ConvertData);

            // editor.Commit();    // applies changes synchronously on older APIs
            editor.Apply();        // applies changes asynchronously on newer APIs
        }

        private void MDone_Click(object sender, System.EventArgs e)
        {

            resourceAdapter.AddItem("Add item");
        }

        public void OnStartDrag(RecyclerView.ViewHolder viewHolder)
        {
            _mItemTouchHelper.StartDrag(viewHolder);
        }

        //Added sample data record here
        public void GetCollection()
        {
            //ISharedPreferencesEditor editor = prefs.Edit();
            //editor.PutString("ObservableCollection_ConvertData", "");
            //editor.Apply();     
            string ConvertData =  prefs.GetString("ObservableCollection_ConvertData","");
            if(string.IsNullOrEmpty(ConvertData))
            {
                ResourceList = new ObservableCollection<string>();
                ResourceList.Add("OnPause()");
                ResourceList.Add("OnStart()");
                ResourceList.Add("OnCreate()");

            }
            else
            {
                ResourceList= JsonConvert.DeserializeObject<ObservableCollection<string>>(ConvertData);
            }

            //var or= ResourceList.ToString();
        }
    }
}

你可以下载我的演示 https://drive.google.com/file/d/1mQTKf3rlcIVnf2N97amrqtnrSCRk-8ZW/view?usp=sharing