Xamarin. Android как запомнить положение элементов в recyclerview - PullRequest
0 голосов
/ 18 июня 2020

У меня есть программа recyclerview, настроенная в xamarin. android согласно коду в этой ссылке

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

Мой вопрос, как я могу запомните положение этих элементов при перезапуске приложения и т. д. c. Когда пользователь добавляет элементы, они вставляются в позицию адаптера 0,1,2,3 et c, но когда они закрывают приложение и возвращаются, это не всегда происходит в том же порядке.

Пользователь также можно переставить перетаскиванием, так что это, кажется, добавляет еще больше путаницы! сказал, что элементы не всегда находятся в том же порядке, что и до закрытия приложения.

Может кто посоветует как лучше это сделать? Я попытался добавить имя элемента и номер позиции в список, преобразованный в json, а затем попытался вставить элемент в сохраненный индекс позиции, но не могу заставить его работать ..

Спасибо

1 Ответ

0 голосов
/ 18 июня 2020

Вы хотите достичь результата, подобного следующему GIF?

enter image description here

Вы можете использовать PreferenceManager для сохранения положения элементов (перед сохранением данных , Я буду сериализовать данные) в recyclerview.

Вы можете переопределить метод OnPause(), этот метод будет выполняться, когда приложение находится в фоновом режиме или приложение убито. Таким образом, мы можем сохранить позицию и данные в этом методе. Вот код примерно 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

...