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效果吗?
您可以使用 PreferenceManager
在 recyclerview
中存储项目的位置(在存储数据之前,我将序列化数据)。
您可以覆盖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
我根据 link
中的代码在 xamarin.android 中设置了一个 recyclerviewhttps://www.appliedcodelog.com/2019/08/reorder-list-items-by-drag-and-drop-in.html
我的问题是,当应用程序重新启动等时,我如何记住这些项目的位置。当用户添加项目时,它们被插入到适配器位置 0、1、2、3 等,但是当他们关闭应用程序时然后回来,它并不总是以相同的顺序。
用户还可以通过拖放重新排列,这似乎增加了更多的混乱!
目前,我通过将列表转换为 Json 并在应用程序再次打开时加载来保存 recyclerview 中的项目,但正如我所说,这些项目并不总是与之前的顺序相同应用程序已关闭。
任何人都可以建议最好的方法吗?我试图将项目名称和位置编号添加到转换为 json 的列表中,然后尝试将项目插入保存的位置索引但无法使其工作..
谢谢
你想达到如下GIF效果吗?
您可以使用 PreferenceManager
在 recyclerview
中存储项目的位置(在存储数据之前,我将序列化数据)。
您可以覆盖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