RecyclerView показывает предыдущие значения, введенные в EditText в новых строках

1

Я создаю приложение Android, в котором я использую recyclerView а строка recyclerView имеет editText.

Это мой класс ReadingAdapter

public class ReadingAdapter extends RecyclerView.Adapter<ReadingAdapter.ViewHolder>  implements AdapterView.OnItemSelectedListener {

    Context context;
    String valOpenReading, valClosReading, valConsumption;
    private List<ReadingData> readingList;
    static String[] arrValOpenRead, arrValClosRead, arrValConsumption;
    public ReadingAdapter(Context context, List<ReadingData> readingList) {
        this.context = context;
        this.readingList = readingList;

        arrValOpenRead = new String[readingList.size()];
        arrValClosRead = new String[readingList.size()];
        arrValConsumption = new String[readingList.size()];
    }

    @Override
    public ReadingAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.reading_sheet_layout, parent, false);
        return new ReadingAdapter.ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final ReadingAdapter.ViewHolder holder, final int position) {
        ReadingData tempData = readingList.get(position);
        holder.pdtName.setText(tempData.pdtName);
        holder.keyId.setText("Key "+tempData.keyId);

        holder.etClosRead.addTextChangedListener(new TextWatcher() {
            boolean ignore = false;
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }
            @Override
            public void afterTextChanged(Editable s) {
                if (ignore)
                    return;
                ignore = true;
                valOpenReading = holder.etOpenRead.getText().toString();
                arrValOpenRead[position] = valOpenReading;
                valClosReading = s.toString().equals("") ? "0": s.toString();
                arrValClosRead[position] = valClosReading;
                if (!valOpenReading.equals("")) {
                    if (Integer.parseInt(valClosReading) < Integer.parseInt(valOpenReading)) {
                        Toast.makeText(context, "Check once! closing reading should be more than opening reading!", Toast.LENGTH_LONG).show();
                        valConsumption = "0";
                        holder.consumption.setText("");
                    } else {
                        valConsumption = (Integer.parseInt(valClosReading) - Integer.parseInt(valOpenReading))+"";
                        arrValConsumption[position] = valConsumption;
                        holder.consumption.setText(valConsumption);
                    }
                } else
                    Toast.makeText(context, "Please fill the opening reading!", Toast.LENGTH_SHORT).show();
                ignore = false;
            }
        });
    }

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

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }

    public class ViewHolder extends RecyclerView.ViewHolder{
        TextView pdtName, keyId, consumption;
        EditText etOpenRead, etClosRead;
        public ViewHolder(View view) {
            super(view);
            pdtName = (TextView)view.findViewById(R.id.txt_list_pdt_supp);
            keyId = (TextView)view.findViewById(R.id.key_set);
            etOpenRead = (EditText)view.findViewById(R.id.open_val_set);
            etClosRead = (EditText)view.findViewById(R.id.clos_val_set);
            consumption = (TextView)view.findViewById(R.id.consumption_val);
        }
    }
}

Это мой ReadingData.java

public class ReadingData {
    String pdtName, keyId, openReading, closReading, consumption;
    public ReadingData(String pdtName, String keyId) {
        this.pdtName = pdtName;
        this.keyId = keyId;
    }
}

Здесь, если я ввожу значение в стартовые элементы recyclerView тогда, когда я просматриваю элементы в нижней части списка, последний элемент будет иметь это значение.

Изображение 174551

Пожалуйста, проигнорируйте качество изображения, поскольку мы не можем загрузить выше 2MiB оснастки.

Здесь виды перерабатываются, поскольку список прокручивается. Как предотвратить копирование значений в другой элемент в списке.

И этот Toast также повторяется несколько раз. Как остановить это.

update: По предложению LQ Gioan через SO question Как работает механизм рециркуляции ListView, я получил логику того, как ListView действительно работает с повторной обработкой просмотров.

Но я не уверен, работает ли recyclerView же.

Но здесь, в моем случае, как я могу реализовать этот процесс. PLS кто-то мне помогает здесь.

  • 0
    ListView повторно использует вид элемента, который не виден на экране. Вы должны посмотреть этот ответ для понимания: stackoverflow.com/questions/11945563/… . Для решения вашей проблемы вы должны сохранить данные, оставленные пользователем, в ReadingData . Каждый раз, когда getView метод getView вы возвращаете эти данные в EditText (s)
  • 0
    Спасибо за ссылку. Теперь я понял, как работает listView . Но что я должен использовать в моем случае? Как я могу добиться этого без повторного использования представлений? Должен ли я использовать recyclerView здесь?
Показать ещё 11 комментариев
Теги:
recycler-adapter
android-recyclerview

2 ответа

0

RecyclerView повторное использование, на самом деле он генерирует только столько, сколько видов, которые видны на экране. поэтому он ожидал, если вы увидите значение, заданное для других строк

В решении будут заданы все атрибуты представления, которые вы изменяете по умолчанию или независимо от того, какая строка должна присутствовать из вашего набора данных

Так положила addTextChangedListener insode ViewHolder конструктора (вы можете получить позицию по телефону getAdapterPosition()) для лучшей производительности и установите editText значение внутри onBindViewHolder метода из набора данных

  • 0
    Спасибо за предложение. Оно работало завораживающе.
0

Ваш код активности:

ListView listview = (ListView) findViewById(R.id.list_view);
listview.setItemsCanFocus(true);
Adapter adapter = new Adapter (YourActivity.this, YourArrayList);
listview .setAdapter(adapter);

Класс адаптера

public class Adapter extends BaseAdapter {

// Declare Variables \\
Context mContext;
LayoutInflater inflater;
Activity act;
String[] temp;


public Adapter(Context context, ArrayList<String> list) {
    mContext = context;
    inflater = LayoutInflater.from(mContext);
    act = (Activity) context;
    //-------Temp String Array-------\\
    temp = new String[this.count];
    for (int i = 0; i < this.count; i++) {
        temp[i] = list.get(i);
    }
    //---------------------------\\

}

public class ViewHolder {
    TextView optionTitle;
    EditText optionText;
    int ref;
}

@Override
public int getCount() {
    return list.size;
}

@Override
public Object getItem(int position) {
    return temp[position];
}

@Override
public long getItemId(int position) {
    return position;
}

public View getView(final int position, View view, ViewGroup parent) {
    final ViewHolder holder;
    if (view == null) {
        holder = new ViewHolder();
        view = inflater.inflate(R.layout.lv_items_add_ques_options_mcq, null);
        holder.optionTitle = (TextView) view.findViewById(R.id.add_ques_opts_count_mcq_tv);
        holder.optionText = (EditText) view.findViewById(R.id.add_ques_opts_title_mcq_et);
        view.setTag(holder);
    } else {
        holder = (ViewHolder) view.getTag();
    }
    holder.ref = position;

    holder.optionTitle.setText(getCharForNumber(position) + ":");

    holder.optionText.setText(temp[position]);
    holder.optionText.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                                      int arg3) {
        }

        @Override
        public void afterTextChanged(Editable arg0) {
            temp[holder.ref] = arg0.toString().trim();
        }
    });

    return view;
}

public void getList() {
    StaticValues.arrayListOptions = new ArrayList<String>(Arrays.asList(temp));
    StaticValues.arrayListOptionsCount = new ArrayList<String>();
    for (int i = 0; i < count; i++) {
        StaticValues.arrayListOptionsCount.add(String.valueOf(i+1));
        Log.e("err_al", StaticValues.arrayListOptions.get(i));
        Log.e("err_al", StaticValues.arrayListOptionsCount.get(i));
    }
}

private String getCharForNumber(int i) {
    char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
    if (i > 25) {
        return null;
    }
    return Character.toString(alphabet[i]);
}}
  • 0
    Спасибо за ответ. Возвращенный вид из адаптера не подвергается переработке?
  • 0
    Что ж, мы сохраняем данные EditText во временном массиве, который используется для хранения данных, поэтому даже если они будут переработаны, ваши данные останутся без изменений.
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню