RecyclerView EditText value erase after scrolling

Viewed 42

EditText input value erase after scrolling down and scrolling up.

I followed many tutorials but nothing worked for me, I tried to implement Textwatcher but I can't perfectly implement it.

Someone please help, I'm stuck with this problem. Please give me a solution if it had multiple edittext too.

here is my adapter code.

public class ClassTestMarkAdapter extends RecyclerView.Adapter<ClassTestMarkAdapter.NviewHolder> {


    private Context mCtx;
    private List<ClassTestMarkModel> marklist;
    public ClassTestMarkAdapter(Context mCtx, List<ClassTestMarkModel> marklist) {
        this.mCtx = mCtx;
        this.marklist = marklist;
    }

    @NonNull
    @Override
    public NviewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) {
        LayoutInflater inflater =LayoutInflater.from(mCtx);
        View v = inflater.inflate(R.layout.class_test_mark_list,null);
        NviewHolder holder =new NviewHolder(v,new MyCustomEditTextListener());
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull final NviewHolder nviewHolder, int position) {
        ClassTestMarkModel markModel =marklist.get(position);
        nviewHolder.myCustomEditTextListener.updatePosition(nviewHolder.getAdapterPosition());
        nviewHolder.wrText.setText(marklist[nviewHolder.getAdapterPosition()]);

        nviewHolder.stname.setText(markModel.getUserName());
        nviewHolder.stroll.setText(markModel.getRoll());
        nviewHolder.wrText.setText(markModel.getMarks());
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mCtx);
        Long instituteID = prefs.getLong("InstituteID",0);
        final String inssid=String.valueOf(instituteID);
        final String subId = prefs.getString("subId", "");
        final String examids = prefs.getString("examidforct", "");
        final String sessionId = prefs.getString("sesId", "");
       final String cTMarkID=markModel.getcTMarkID();
       final String insCTID=markModel.getInsCTID();
       final String userID=markModel.getUserID();

        nviewHolder.btnMark.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                RequestQueue myRequestQueue = Volley.newRequestQueue(mCtx);
                String url = mCtx.getResources().getString(R.string.baseUrlLocal)+"setExamCTMarks";
                final String xNon=nviewHolder.wrText.getText().toString();

                 Double wrsum= Double.valueOf(xNon);

                if (wrsum>0){
                    nviewHolder.btnMark.setText("Success!");
                    nviewHolder.btnMark.setBackgroundColor(Color.parseColor("#009000"));

                }


                StringRequest myStringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        Toast.makeText(mCtx,"Success! Data Posted Sucessfully",Toast.LENGTH_SHORT).show();


                    }
                }, new Response.ErrorListener() { //Create an error listener to handle errors appropriately.
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(mCtx,"Error: Something Wrong...",Toast.LENGTH_SHORT).show();
                    }
                }) {
                    protected Map<String, String> getParams() {
                        Map<String, String> MyData = new HashMap<String, String>();
                        MyData.put("CTMarkID", cTMarkID);
                        MyData.put("InsCTID", insCTID);
                        MyData.put("UserID",userID);
                        MyData.put("SessionID", sessionId);
                        MyData.put("SubjectID", subId);
                        MyData.put("ExamID", examids);
                        MyData.put("ObtainMarks",xNon);
                        MyData.put("InstituteID",inssid);
                        MyData.put("IsAbsent", "");
                        MyData.put("LoggedUserID", "123");
                        MyData.put("IP", "123");
                        return MyData;
                    }
                };
                myRequestQueue.add(myStringRequest);
            }

        });

    }

    @Override
    public int getItemCount() {
        return marklist.size();
    }

    class NviewHolder extends RecyclerView.ViewHolder{
        TextView stname, stroll;
        LinearLayout parentLayout;
        Button btnMark;
        EditText wrText;
       //String wrMark;
       public MyCustomEditTextListener myCustomEditTextListener;

        public NviewHolder(@NonNull View itemView, MyCustomEditTextListener myCustomEditTextListener) {
            super(itemView);

            stname =itemView.findViewById(R.id.clsmarkName);
            stroll =itemView.findViewById(R.id.clsmkRoll);
            parentLayout = itemView.findViewById(R.id.ctMarkList);
            btnMark =itemView.findViewById(R.id.clsmarkBtn);
            this.wrText = itemView.findViewById(R.id.editText);
            this.myCustomEditTextListener = myCustomEditTextListener;
            this.wrText.addTextChangedListener(myCustomEditTextListener);

        }
    }
    private class MyCustomEditTextListener implements TextWatcher {
        private int position;
        public void updatePosition(int position) {
            this.position = position;
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
       marklist[position] = s.toString();

        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    }
}
1 Answers

Update your list item on text change using text watcher after setText to edit text.

Or Alternatively, For best practices use two way data binding to overcome this issue.

Related