1

When I scroll down and then back to the top, my items were changed for other items in the list, and if I scroll again, the items again are changed.

The edit text value disappears and spinner value changes automatically.

This is my MyRecyclerViewAdapter class.

class MyRecyclerViewAdapter extends
        RecyclerView.Adapter<MyRecyclerViewAdapter.CustomViewHolder> {
    private List<UpdateAtt> feedItemList;
    private Context mContext;
    private String[] mColorNames = new String[]{"Absent", "Half Day", "Leave", "Present", "Suspend"};

    public MyRecyclerViewAdapter(Context context, List<UpdateAtt> feedItemList) {
        this.feedItemList = feedItemList;
        this.mContext = context;
    }

    @Override
    public CustomViewHolder onCreateViewHolder(ViewGroup parent, final int i) {
        //View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_attendance, null);
        View mView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_attendance, parent, false);
        CustomViewHolder viewHolder = new CustomViewHolder(mView);
        return viewHolder;
    }

    class CustomViewHolder extends RecyclerView.ViewHolder {

        private final TextView tvName;
        private final TextView tvSid;
        private final EditText etRemark;
        private final Spinner tvSpinner;

        public CustomViewHolder(View view) {
            super(view);
            this.tvName = (TextView) view.findViewById(R.id.tv_Name);
            this.tvSid = (TextView) view.findViewById(R.id.tv_sid);
            this.etRemark = (EditText) view.findViewById(R.id.et_remarks);
            this.tvSpinner = (Spinner) view.findViewById(R.id.spinner1);
            ArrayAdapter<String> startColorsAdapter = new ArrayAdapter<String>(mContext, R.layout.simple_list_item, mColorNames);
            tvSpinner.setAdapter(startColorsAdapter);
        }
    }

    @Override
    public void onBindViewHolder(final CustomViewHolder customViewHolder, final int position) {
        customViewHolder.tvName.setText(Html.fromHtml(feedItemList.get(position).getSName()));
        customViewHolder.tvSid.setText(Html.fromHtml(feedItemList.get(position).getSid()));
        customViewHolder.etRemark.setText(Html.fromHtml(feedItemList.get(position).getRemark()));

        //Setting text view title
    }

    @Override
    public int getItemCount() {
        return (null != feedItemList ? feedItemList.size() : 0);
    }
}
Reaz Murshed
  • 23,691
  • 13
  • 78
  • 98

2 Answers2

1

Use holder.getAdapterPosition() in onBindViewHolder(), instead of position returned by onBindViewHolder(). Like,

customViewHolder.tvName.setText(Html.fromHtml(feedItemList.get(customViewHolder.getAdapterPosition()).getSName()));

Edited: Set: customViewHolder.setIsRecyclable(false);

Insane Developer
  • 1,014
  • 10
  • 19
  • please put a line of code to where to use getAdapterPosition(). –  Mar 09 '18 at 16:34
  • I have put a line of your code in my answer. Kindly go through it. – Insane Developer Mar 09 '18 at 16:35
  • i want mention that the edittext field are editable and when i enter some text or set a value in dropdown or spinner then scroll it changed the values or dissapears edittext value. –  Mar 09 '18 at 16:36
0

I would like to suggest you to change your adapter class like the following. It should work.

class MyRecyclerViewAdapter extends
        RecyclerView.Adapter<MyRecyclerViewAdapter.CustomViewHolder> {
    private List<UpdateAtt> feedItemList;
    private Context mContext;
    private String[] mColorNames = new String[]{"Absent", "Half Day", "Leave", "Present", "Suspend"};

    public MyRecyclerViewAdapter(Context context, List<UpdateAtt> feedItemList) {
        this.feedItemList = feedItemList;
        this.mContext = context;
        ArrayAdapter<String> startColorsAdapter = new ArrayAdapter<String>(mContext, R.layout.simple_list_item, mColorNames);
    }

    @Override
    public CustomViewHolder onCreateViewHolder(ViewGroup parent, final int i) {
        //View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_attendance, null);
        View mView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_attendance, parent, false);
        CustomViewHolder viewHolder = new CustomViewHolder(mView);
        return viewHolder;
    }

    class CustomViewHolder extends RecyclerView.ViewHolder {

        private final TextView tvName;
        private final TextView tvSid;
        private final EditText etRemark;
        private final Spinner tvSpinner;
        ArrayAdapter<String> startColorsAdapter;

        public CustomViewHolder(View view) {
            super(view);
            this.tvName = (TextView) view.findViewById(R.id.tv_Name);
            this.tvSid = (TextView) view.findViewById(R.id.tv_sid);
            this.etRemark = (EditText) view.findViewById(R.id.et_remarks);
            this.tvSpinner = (Spinner) view.findViewById(R.id.spinner1);
            startColorsAdapter = new ArrayAdapter<String>(mContext, R.layout.simple_list_item, mColorNames);
        }

        public void bindView(int position) {
            tvName.setText(Html.fromHtml(feedItemList.get(position).getSName()));
            tvSid.setText(Html.fromHtml(feedItemList.get(position).getSid()));
            etRemark.setText(Html.fromHtml(feedItemList.get(position).getRemark()));
            tvSpinner.setAdapter(startColorsAdapter);
        }
    }

    @Override
    public void onBindViewHolder(final CustomViewHolder customViewHolder, final int position) {
        customViewHolder.bindView(position);
    }

    @Override
    public int getItemCount() {
        return (null != feedItemList ? feedItemList.size() : 0);
    }
}

And for saving the state of your spinner item in each row, you need to declare an array for saving those state and populate the exact item in the spinner accordingly inside the bindView function.

Reaz Murshed
  • 23,691
  • 13
  • 78
  • 98
  • customViewHolder.bindView(items.get(position)); what is items in this line of code –  Mar 09 '18 at 18:09
  • Sorry, only `position` should be passed. Please check the updated code. – Reaz Murshed Mar 09 '18 at 18:13
  • What's the problem you are facing now? – Reaz Murshed Mar 10 '18 at 03:57
  • Still when I put some text in edittext and scroll recyclerview the text field text disappeared –  Mar 10 '18 at 16:51
  • Yes, of course it will be disappeared. You need to save the text in an array when you are putting a text into your `EditText`. Then in your `bindView` function, you need to get the text from the array and set it into your `EditText` accordingly. Add a `TextWatcher` in your `EditText` to get the input values in your `EditText`. – Reaz Murshed Mar 10 '18 at 19:01
  • sir can you please add that code in comment to add text in array –  Mar 14 '18 at 09:23
  • I would like to suggest you to look into this answer - https://stackoverflow.com/a/31860393/3145960. This explains how you save the texts from your `EditText` to an array of `String` and then populate it back while recycling your views. – Reaz Murshed Mar 14 '18 at 09:37