Как мне получить несколько значений edittext из динамически добавляемых представлений в линейном представлении внутри listview

#java #android

#java #Android

Вопрос:

Я пытаюсь реализовать список edittext внутри listview. Я успешно добавил это, добавив динамически view внутри вертикального linearlayout. Теперь мне нужно получить значения из каждого значения edittext из каждого основного элемента списка. Пожалуйста, проверьте изображение ниже

файл изображения

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

 @Override
public View getView(final int position, View convertView, ViewGroup parent) {

    if (convertView != null){
        return convertView;
    }

    convertView = LayoutInflater.from(context).inflate(R.layout.item,parent,false);

    final LinearLayout subItem = convertView.findViewById(R.id.lvSubItem);
    subItem.removeAllViews();

    for (final Faltu faltu : posms.get(position).getFaltus()){
        View subView = LayoutInflater.from(context).inflate(R.layout.subitem,null);
        final EditText subEditText = subView.findViewById(R.id.subItem);

        subItem.addView(subView);
        subEditText.setTag(subItem.indexOfChild(subView));


    return convertView;
}
  

Я попытался добавить TextChangedListener к editext внутри цикла for, и onTextChanged я обновил свой список значений текстом. Но, к сожалению, он обновляет все значения с одинаковым значением.

 subEditText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                subEditText.requestFocus();
            }

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

            }

            @Override
            public void afterTextChanged(Editable s) {
                if (s.length() > 0){
                    posms.get(position).getFaltus().get((Integer) subEditText.getTag()).setNumber(s.toString());

                }
            }
        });
  

Любое предложение приветствуется

Ответ №1:

Попробуйте использовать эти строки кода

 for (int i = 0; i < posms.get(position).getFaltus().size(); i  ) {

            final Faltu faltu = posms.get(position).getFaltus().get(i);

            View subView = LayoutInflater.from(context).inflate(R.layout.subitem, null);
            final EditText subEditText = subView.findViewById(R.id.subItem);

            subItem.addView(subView);
            subEditText.setTag(i);

            subEditText.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    subEditText.requestFocus();
                }

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

                }

                @Override
                public void afterTextChanged(Editable s) {
                    if (s.length() > 0){
                        //posms.get(position).getFaltus().get(i).setNumber(s.toString());
                        faltu.setNumber(s.toString());
                    }
                }
            });

        }
  

Комментарии:

1. обновляет ли faltu.setNumber(s.toString()); значение также в списке?

2. да, но вы должны уведомить адаптер, вызвав notifyDataSetChanged

3. есть идеи, где я должен вызвать notifyDataSetChanged ?

4. @user3921178 только что попробовал ваш код. К сожалению, он обновляет все элементы с одинаковыми значениями.

5. если вы вносите какие-либо изменения в список, то после изменения вам нужно вызвать notifyDataSetChanged() , чтобы отобразить эффект измененного списка в listview. Везде, где вы применяли изменения в списке, вызывайте notifyDataSetChanged() . В вашем случае это должно быть afterTextChanged после faltu обновления объекта. Примечание: — listview обновляется после каждого ввода текста в edittext, поэтому он может застрять.