Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 拖动更改项目位置后保存回收视图_Android_Android Recyclerview_Drag And Drop_Sharedpreferences - Fatal编程技术网

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