0

I have a ListView with the ViewHolder pattern. On the screen there is room for 10 rows. When I scroll down the ListView then android calls getView with position = 12 but the convertView.getTag() returns a ViewHolder with position = 0.

Here is my code:

public View getView(int position, View convertView, ViewGroup parent) {
        final int pos = position;
        ViewHolder holder;
        TextView positionText;
        TextView nameText;
        //TextView resultText;
        //TextView unitText;
        //TextView remarkText;

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.row_maintenancetask, null);
            maxPosition = position;

            EditText remarkText;
            EditText resultText;

            remarkText = (EditText) convertView.findViewById(R.id.remarktext);
            resultText = (EditText) convertView.findViewById(R.id.editTextResult);

            holder = new ViewHolder();
            holder.position = position;
            holder.edtRemark = remarkText;
            holder.edtResultText = resultText;

            holder.edtRemark.addTextChangedListener(new TextWatcher() {

                @Override
                public void onTextChanged(CharSequence s, int start,
                        int before, int count) {
                    //setting data to array, when changed
                    m_maintenancetasks.get(pos).setMaintenanceTaskRemark(s.toString());
                }

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

                }

                @Override
                public void afterTextChanged(Editable s) {

                }
            }); 

            holder.edtResultText.addTextChangedListener(new TextWatcher() {

                @Override
                public void onTextChanged(CharSequence s, int start,
                        int before, int count) {
                    //setting data to array, when changed
                    m_maintenancetasks.get(pos).setMaintenanceTaskResult(s.toString());
                }

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

                }

                @Override
                public void afterTextChanged(Editable s) {

                }
            });
        }
        else
        {
            holder = (ViewHolder)convertView.getTag();
        }

        positionText = (TextView) convertView.findViewById(R.id.positiontext);
        nameText = (TextView) convertView.findViewById(R.id.nametext);
        //resultText = (TextView) convertView.findViewById(R.id.resulttext);
        //unitText = (TextView) convertView.findViewById(R.id.maintenanceunittext);



        holder.edtRemark.setOnTouchListener(onListTouch);
        holder.edtRemark.setText(m_maintenancetasks.get(position).getMaintenanceTaskRemark());



        holder.edtResultText.setOnTouchListener(onListTouch);
        holder.edtResultText.setText(m_maintenancetasks.get(position).getMaintenanceTaskResult());


        convertView.setOnTouchListener(onListTouch);
        convertView.setTag(holder);

        return convertView;
    }

    private class ViewHolder {
        Integer position;
        EditText edtRemark;
        EditText edtResultText;
    }
kovacs lorand
  • 741
  • 7
  • 23
  • http://stackoverflow.com/questions/16453379/android-list-adapter-returns-wrong-position-in-getview – Daniel Puiu Jan 31 '17 at 13:16
  • 3
    Possible duplicate of [Android, List Adapter returns wrong position in getView](http://stackoverflow.com/questions/16453379/android-list-adapter-returns-wrong-position-in-getview) – nnesterov Jan 31 '17 at 13:17

1 Answers1

0

That's the expected behaviour. Android is recycling the views, so if you keep scrolling you will get a Viewholder with position 1. You should not store the position in the Viewholder.

Juan Martinez
  • 770
  • 5
  • 16