Android 拖动更改项目位置后保存回收视图
我有一个Android 拖动更改项目位置后保存回收视图,android,android-recyclerview,drag-and-drop,sharedpreferences,Android,Android Recyclerview,Drag And Drop,Sharedpreferences,我有一个recyclerview,我可以通过拖动所有内容来更改其项目位置。很好用 但在我关闭应用程序后,这些项目又恢复到我如何保存新职位之前的状态。我认为SharedReferences将是一个很好的解决方案,但我不知道如何使用它 我该怎么做呢 我的密码在这里 public class MyItemTouchHelper extends ItemTouchHelper.Callback { private final ItemTouchHelpAdapter mAdapter;
recyclerview
,我可以通过拖动所有内容来更改其项目位置。很好用
但在我关闭应用程序后,这些项目又恢复到我如何保存新职位之前的状态。我认为SharedReferences
将是一个很好的解决方案,但我不知道如何使用它
我该怎么做呢
我的密码在这里
public class MyItemTouchHelper extends ItemTouchHelper.Callback {
private final ItemTouchHelpAdapter mAdapter;
public MyItemTouchHelper(ItemTouchHelpAdapter mAdapter) {
this.mAdapter = mAdapter;
}
@Override
public boolean isLongPressDragEnabled() {
return false;
}
@Override
public boolean isItemViewSwipeEnabled() {
return true;
}
@Override
public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
viewHolder.itemView.setBackgroundColor(
ContextCompat.getColor(viewHolder.itemView.getContext(),R.color.cardview_shadow_end_color)
);
}
@Override
public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);
if (actionState==ItemTouchHelper.ACTION_STATE_DRAG){
viewHolder.itemView.setBackgroundColor(
Color.LTGRAY
);
}
}
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
final int swipeFlags = 0;
return makeMovementFlags(dragFlags,swipeFlags);
}
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
mAdapter.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());
return true;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
mAdapter.onItemSwipe(viewHolder.getAdapterPosition());
}
}
公共类RecycleServiceAdapter扩展了RecyclerView。适配器实现
ItemTouchHelpAdapter{
私有静态最终字符串TAG=“RecycleServiceAdapter”;
private ArrayList mgamename=new ArrayList();
私有静态ItemTouchHelper mTouchHelper;
私有上下文;
公共RecycleServiceAdapter(ArrayList MGamName,Context mcontext){
this.mgamename=mgamename;
this.mcontext=mcontext;
}
@非空
@凌驾
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType){
View View=LayoutInflater.from(parent.getContext()).flate(R.layout.layout\u listitem,parent,false);
ViewHolder=新的ViewHolder(视图);
报税表持有人;
}
@凌驾
public void onBindViewHolder(@NonNull final ViewHolder,final int position){
Log.d(标记“onBindViewHolder:called”);
holder.gamename.setText(mgamename.get(position));
holder.gamename.setOnClickListener(新视图.OnClickListener(){
@RequiresApi(api=Build.VERSION\u CODES.JELLY\u BEAN)
@凌驾
公共void onClick(视图){
如果(位置==0){
Intent intent1=新的Intent(view.getContext(),cc.class);
mcontext.startActivity(intent1);}
如果(位置==1){
Intent intent1=新的Intent(view.getContext(),tc.class);
mcontext.startActivity(intent1);
}
如果(位置==2){
Intent intent1=新的Intent(view.getContext(),k.class);
mcontext.startActivity(intent1);
}
如果(位置==3){
Intent intent1=新的Intent(view.getContext(),ccp.class);
mcontext.startActivity(intent1);
}
如果(位置==4){
Intent intent1=新的Intent(view.getContext(),tcp.class);
mcontext.startActivity(intent1);
}
如果(位置==5){
Intent intent1=新的Intent(view.getContext(),kp.class);
mcontext.startActivity(intent1);
}
如果(位置==6){
Intent intent1=新的Intent(view.getContext(),balot.class);
mcontext.startActivity(intent1);
}
如果(位置==7){
Intent intent1=新的Intent(view.getContext(),tarneeb31.class);
mcontext.startActivity(intent1);
}
如果(位置==8){
Intent intent1=新意图(view.getContext(),tarneeb61.class);
mcontext.startActivity(intent1);
}
如果(位置==9){
Intent intent1=新的Intent(view.getContext(),tarneeb41.class);
mcontext.startActivity(intent1);
}
如果(位置==10){
Intent intent1=新的Intent(view.getContext(),tarneeb41e.class);
mcontext.startActivity(intent1);
}
如果(位置==11){
Intent intent1=新的Intent(view.getContext(),tarneeb400.class);
mcontext.startActivity(intent1);
}
}
});
}
@凌驾
public int getItemCount(){
返回mgamename.size();
}
@凌驾
公共空间ONIMMOVE(int fromPosition、int toPostion){
字符串fromNote=mgamename.get(fromPosition);
mgamename.remove(从注释中删除);
mgamename.add(toPostion,fromNote);
notifyItemMoved(从位置、拓扑);
}
@凌驾
公共空间(内部位置){
mgamename.remove(position);
已删除的项目(职位);
}
public void setmTouchHelper(ItemTouchHelper touchHelper){
this.mTouchHelper=touchHelper;
}
公共静态类ViewHolder扩展了RecyclerView.ViewHolder实现
View.OnTouchListener、GestureDetector.OnTestureListener{
文本视图游戏名称;
相对亲子布局;
文本视图编号;
卡德维尤;
手势检测器mGestureDetector;
公共视图持有者(@NonNull View itemView){
超级(项目视图);
gamename=(TextView)itemView.findViewById(R.id.gamename);
number=(TextView)itemView.findViewById(R.id.number);
parentLayout=(RelativeLayout)itemView.findViewById(R.id.parent\u布局);
cardView=(cardView)itemView.findViewById(R.id.cardv);
mGestureDetector=新的GestureDetector(itemView.getContext(),this);
setOnTouchListener(这个);
}
@凌驾
公共布尔onDown(MotionEvent MotionEvent){
返回false;
}
@凌驾
在ShowPress上公开作废(运动事件){
}
@凌驾
公共布尔onSingleTapUp(MotionEvent MotionEvent){
callOnClick();
返回false;
}
@凌驾
公共布尔onScroll(MotionEvent、MotionEvent、motionEvent1、浮点v、浮点v1){
返回false;
}
@凌驾
public void onLongPress(运动事件){
mTouchHelper.startDrag(this);
}
@凌驾
公共布尔onFling(MotionEvent、MotionEvent、motionEvent1、浮点v、浮点v1
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> implements
ItemTouchHelpAdapter{
private static final String TAG = "RecyclerViewAdapter";
private ArrayList<String> mgamename = new ArrayList<>();
private static ItemTouchHelper mTouchHelper;
private Context mcontext;
public RecyclerViewAdapter(ArrayList<String> mgamename, Context mcontext) {
this.mgamename = mgamename;
this.mcontext = mcontext;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_listitem,parent,false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
Log.d(TAG,"onBindViewHolder: called.");
holder.gamename.setText(mgamename.get(position));
holder.gamename.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onClick(View view) {
if (position==0){
Intent intent1 = new Intent(view.getContext(),cc.class);
mcontext.startActivity(intent1);}
if (position==1){
Intent intent1 = new Intent(view.getContext(),tc.class);
mcontext.startActivity(intent1);
}
if (position==2){
Intent intent1 = new Intent(view.getContext(),k.class);
mcontext.startActivity(intent1);
}
if (position==3){
Intent intent1 = new Intent(view.getContext(),ccp.class);
mcontext.startActivity(intent1);
}
if (position==4){
Intent intent1 = new Intent(view.getContext(),tcp.class);
mcontext.startActivity(intent1);
}
if (position==5){
Intent intent1 = new Intent(view.getContext(),kp.class);
mcontext.startActivity(intent1);
}
if (position==6){
Intent intent1 = new Intent(view.getContext(),balot.class);
mcontext.startActivity(intent1);
}
if (position==7){
Intent intent1 = new Intent(view.getContext(),tarneeb31.class);
mcontext.startActivity(intent1);
}
if (position==8){
Intent intent1 = new Intent(view.getContext(),tarneeb61.class);
mcontext.startActivity(intent1);
}
if (position==9){
Intent intent1 = new Intent(view.getContext(),tarneeb41.class);
mcontext.startActivity(intent1);
}
if (position==10){
Intent intent1 = new Intent(view.getContext(),tarneeb41e.class);
mcontext.startActivity(intent1);
}
if (position==11){
Intent intent1 = new Intent(view.getContext(),tarneeb400.class);
mcontext.startActivity(intent1);
}
}
});
}
@Override
public int getItemCount() {
return mgamename.size();
}
@Override
public void onItemMove(int fromPosition, int toPostion) {
String fromNote = mgamename.get(fromPosition);
mgamename.remove(fromNote);
mgamename.add(toPostion,fromNote);
notifyItemMoved(fromPosition,toPostion);
}
@Override
public void onItemSwipe(int postion) {
mgamename.remove(postion);
notifyItemRemoved(postion);
}
public void setmTouchHelper(ItemTouchHelper touchHelper){
this.mTouchHelper = touchHelper;
}
public static class ViewHolder extends RecyclerView.ViewHolder implements
View.OnTouchListener, GestureDetector.OnGestureListener {
TextView gamename;
RelativeLayout parentLayout;
TextView number;
CardView cardView;
GestureDetector mGestureDetector;
public ViewHolder(@NonNull View itemView) {
super(itemView);
gamename = (TextView) itemView.findViewById(R.id.gamename);
number = (TextView) itemView.findViewById(R.id.number);
parentLayout = (RelativeLayout) itemView.findViewById(R.id.parent_layout);
cardView = (CardView)itemView.findViewById(R.id.cardv);
mGestureDetector = new GestureDetector(itemView.getContext(),this);
itemView.setOnTouchListener(this);
}
@Override
public boolean onDown(MotionEvent motionEvent) {
return false;
}
@Override
public void onShowPress(MotionEvent motionEvent) {
}
@Override
public boolean onSingleTapUp(MotionEvent motionEvent) {
cardView.callOnClick();
return false;
}
@Override
public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
return false;
}
@Override
public void onLongPress(MotionEvent motionEvent) {
mTouchHelper.startDrag(this);
}
@Override
public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
return false;
}
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
mGestureDetector.onTouchEvent(motionEvent);
return true;
}
}
}
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private ArrayList<String> mgamename = new ArrayList<>();
private SharedPreferences mSharedPreferences;
private SharedPreferences.Editor mEditor;
public static final String LIST_OF_SORTED_DATA_ID = "json_list_sorted_data_id";
public final static String PREFERENCE_FILE = "preference_file";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSharedPreferences = this.getApplicationContext().getSharedPreferences(PREFERENCE_FILE,Context.MODE_PRIVATE);
mEditor = mSharedPreferences.edit();
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Log.d(TAG,"onCreate: started.");
mgamename.add("Complex Complex");
mgamename.add("Trix Complex");
mgamename.add("Kingdoms");
mgamename.add("Complex Complex Partner");
mgamename.add("Trix Complex Partner");
mgamename.add("Kingdoms Partner");
mgamename.add("Balot");
mgamename.add("Tarneeb 31");
mgamename.add("Tarneeb 61");
mgamename.add("Tarneeb 41(Syrian)");
mgamename.add("Tarneeb 41 (Egyptian)");
mgamename.add("Tarneeb 400");
initRecyclerView();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.item1:
Intent myIntent = new Intent(Intent.ACTION_SEND);
myIntent.setType("text/plain");
String shareBody = "An App to Calculate All Your Beloved Games Such As Balot Tarneeb Trix etc";
String shareSub = "Cards Game Calculator";
myIntent.putExtra(Intent.EXTRA_SUBJECT,shareSub);
myIntent.putExtra(Intent.EXTRA_TEXT,shareBody);
startActivity(Intent.createChooser(myIntent,"Share Using"));}
switch (item.getItemId()){
case R.id.item2:
AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this)
.setTitle("About")
.setMessage("Calculation Note For Your Beloved Games Such As Balot Taneeb Trix. Enjoy!")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
})
.show();
alertDialog.setCanceledOnTouchOutside(false);
}
return super.onOptionsItemSelected(item);
}
private void initRecyclerView(){
Log.d(TAG,"initRecyclerView: init recyclerview");
RecyclerView recyclerview = findViewById(R.id.recycler_view);
final RecyclerViewAdapter adapter = new RecyclerViewAdapter(mgamename,this);
recyclerview.setLayoutManager(new LinearLayoutManager(this));
ItemTouchHelper.Callback callback = new MyItemTouchHelper(adapter);
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback);
adapter.setmTouchHelper(itemTouchHelper);
itemTouchHelper.attachToRecyclerView(recyclerview);
recyclerview.setAdapter(adapter);
}
}
/**
* Call it in onCreate where your first set data
*/
private void initArrayList(){
SharedPreferences sp = getSharedPreferences("array_pref", Context.MODE_PRIVATE);
String data = sp.getString("myarray", "");
if(data.equals("")) {
mgamename.add("Complex Complex");
mgamename.add("Trix Complex");
mgamename.add("Kingdoms");
mgamename.add("Complex Complex Partner");
mgamename.add("Trix Complex Partner");
mgamename.add("Kingdoms Partner");
mgamename.add("Balot");
mgamename.add("Tarneeb 31");
mgamename.add("Tarneeb 61");
mgamename.add("Tarneeb 41(Syrian)");
mgamename.add("Tarneeb 41 (Egyptian)");
mgamename.add("Tarneeb 400");
}else{
String [] array = data.split(",");
for (int i = 0; i < array.length; i++) {
mgamename.add(array[i]);
}
}
}
/**
* Save your array list in SharedPreference when you exit
* you can implement it onBackPressed or onDestroy in your Activity lifecycle
* OR you can call it when you drag item and ArrayList data position changed
* @param arr
*/
public void saveDatOnExit(ArrayList<String> arr) {
if (arr == null) return;
String array = "";
for (int i = 0; i < arr.size(); i++) {
if(i<(arr.size()-1)){
array+=arr.get(i)+",";
}else{
array+=arr.get(i);
}
}
SharedPreferences sp = getSharedPreferences("array_pref", Context.MODE_PRIVATE);
sp.edit().putString("myarray", array).commit();
}