【问题标题】:save recyclerview after change item position by drag通过拖动更改项目位置后保存recyclerview
【发布时间】:2020-05-25 10:32:40
【问题描述】:

我有一个recyclerview,我可以通过拖动所有内容来更改其项目位置。它工作正常。

但是在我关闭应用程序后,项目恢复到之前的状态,我该如何保存新位置。我认为SharedPreferences 会是一个很好的解决方案,但我不知道如何使用它。

我该怎么做。

我的代码在这里..

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());

    }
}
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);

    }
}

请帮助我,提前谢谢你。

【问题讨论】:

  • 为此使用 Room 数据库。将您的列表存储在本地数据库中。

标签: android android-recyclerview drag-and-drop sharedpreferences


【解决方案1】:

你可以像这样使用 SharedPreference

  1. 在从应用程序退出时将数据另存为用逗号分隔的字符串
  2. 再次返回时拆分数组并将它们分配给 ArrayList

打开应用时的首次初始化

/**
 * 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]);
        }
    }
}

退出时或通过拖动更改数据位置时将数据保存在 sharedPreference 中

 /**
 * 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();
}

但最好的方法是使用 Sqlite 数据库

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多