как задать значение edittext с одинаковым идентификатором в разных раздутых представлениях linearlayout?


У меня есть один основной макет с одним LinearLayout. В этом LinearLayout I раздувает несколько XML-макетов, которые содержат форму с несколькими текстовыми полями (3 EditText) в нем.

С первой попытки я показываю только одну форму. Есть кнопка для добавления дополнительных форм. Предположим, если пользователь нажимает на кнопку"Добавить" два раза, то у пользователя есть три полных формы. Я успешно получаю все данные этих трех форм.

Для этого я ориентируюсь на основной макет "LinearLayout" и потом пересчитывает своего ребенка. После подсчета его дочерних представлений я вызвал дочерние представления Main LinearLayout по его позиции, а затем получил данные EditText и сохранил их в списке. Затем я переместил этот список на следующую страницу. До тех пор все работает нормально. Но если пользователь возвращается на предыдущую страницу, все раздутые макеты исчезли. Итак, я подсчитываю размер списка в резюме и устанавливаю значения, которые пользователи писали в прошлый раз.

Проблема заключается в том, что я устанавливаю значения EditText в соответствии с его позицией представления. Только последний значение объекта (списка) отображается во всех раздутых макетах. Означает, когда для завершения цикла он устанавливает последнее значение объекта во всех макетах. Это мой метод задания значений для представления:

private void addFormDataOnResume(LinearLayout viewForm,Traveller otherTraveller)
{
    EditText dateOfBirthEt = (EditText)viewForm.findViewById(R.id.dateOfBirth);

    dateOfBirthEt.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            showDatePickerDialog(dateOfBirthEt);
        }
    });

    dateOfBirthEt.setText(otherTraveller.getOtherDateOfBirth());

    EditText firstNameET = (EditText)viewForm.findViewById(R.id.firstName);
    firstNameET.setText(otherTraveller.getOtherFirstName());

    EditText lastNameEt = (EditText)viewForm.findViewById(R.id.lastName);
    lastNameEt.setText(otherTraveller.getOtherLastName());
}

Мой код цикла:

int otherTraSize = otherTravellersData.size();
//adultsForms is the main linear layout in which I am adding views
for(k=0; k < otherTraSize; k++)
{
addFormOnResume();//Function for adding form layout
int viewPos = adultsForms.getChildCount();
if(viewPos>0)
{  
addFormDataOnResume(adultsForms.getChildAt(viewPos-1), otherTravellersData.get(k));
}
}

Моя функция для добавления форм:

private void addFormOnResume()
{
    LinearLayout viewForm = (LinearLayout)layoutInflater.inflate(R.layout.other_traveller_form, null );
            adultsForms.addView(viewForm);

}

Я отлаживаю свой код, все данные списка кажутся прекрасными. Объекты находятся в правильном порядке с соответствующими значениями.
Пожалуйста, помогите мне, почему только последнее значение объекта устанавливается для всех завышенных форм.

Любая помощь была бы действительно оцененный......Спасибо заранее.

3 2

3 ответа:

Замените код цикла следующим:

int otherTraSize = otherTravellersData.size();
//adultsForms is the main linear layout in which I am adding views
for(k=0; k < otherTraSize; k++)
{
addFormOnResume();//Function for adding form layout
}

int viewPos = adultsForms.getChildCount();
if(viewPos>0)
{  
   for(int x=0; x<viewPos; x++){
      Log.d("current value",otherTravellersData.get(x).getOtherFirstName());
      addFormDataOnResume(adultsForms.getChildAt(viewPos-1), otherTravellersData.get(x));}
}

Наконец я получил ответ на свой собственный вопрос. По умолчанию, когда действие переходит в режим onPause. Android сохраняет значение EditText относительно идентификатора, а когда мы возобновляем его, восстанавливает последнее сохраненное значение EditText. Итак,в моем случае это восстановление последних значений формы во всех формах компоновки. Решение моей проблемы состоит в том, чтобы установить android: saveEnabled= "false" на запись виджета в XML. Я добавил Это во все EditText. Android больше не сохраняет мои данные и onResume я могу установить значение полей моей формы все, что я хочу, просто получая childView из указанной позиции, даже если у них есть тот же идентификатор.

Это мой рабочий код

 @Override
        public void onClick(View v) {
            switch (v.getId()) {

        case R.id.btnAdd:
            view = layoutInflater.inflate(R.layout.fragment_add_materials, null);
            parentLinearLayout.addView(view);
            arrayList.add(view);

            edtMaterialName = (EditText) view.findViewById(R.id.edtinput_material1);
            editTextCoast = (EditText) view.findViewById(R.id.editTextCoast1);

            edtMaterialName.addTextChangedListener(getMyTextWatcher(edtMaterialName,arrayListMaterials.size()-1 ,"name"));
            editTextCoast.addTextChangedListener(getMyTextWatcher(editTextCoast, arrayListMaterials.size()-1,  "cost"));

            break;




TextWatcher getMyTextWatcher(final EditText edtText, final int listPosition, String nameOrcost){
            return new MyTextWatcher(edtText, listPosition, nameOrcost);
        }




class MyTextWatcher implements TextWatcher{
    int position;
    EditText edtText;
    String nameOrcost;
    MaterialData data;
    boolean flag;
    int count;

    public MyTextWatcher(EditText edtText1, int listPosition, String nameOrcost){
        this.position = listPosition;
        this.edtText=edtText1;
        this.nameOrcost = nameOrcost;
        data = arrayListMaterials.get(position);

    }

    @Override
    public void afterTextChanged(Editable sEditable) {
        try{
        if(this.nameOrcost.equals("name") && edtText.getEditableText().toString().length()>0){
            data.setMaterialName(edtText.getEditableText().toString());
        }
        if(this.nameOrcost.equals("cost") && edtText.getEditableText().toString().trim().length()>0){
            String tempCost = edtText.getEditableText().toString().trim();
            NumberFormat myFormatter = NumberFormat.getInstance();
            Number number = myFormatter.parse(tempCost);

            data.setMaterialprice(new BigDecimal(number.toString()).toString());
        }
        arrayListMaterials.set(position, data);
        setTotalPrice(arrayListMaterials);
        }catch (Exception e) {
            e.printStackTrace();
        }
        if(this.nameOrcost.equals("cost") && edtText.getEditableText().toString().trim().length()>0){
            Utilty.insertCommaIntoNumber(edtText, sEditable.toString());
        }
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        try{    
            if(this.nameOrcost.equals("cost"))
            data.setMaterialprice("0");

            if(this.nameOrcost.equals("name"))
            data.setMaterialName("");

            arrayListMaterials.set(position, data);

        }catch (Exception e) {
            e.printStackTrace();
        }
    }

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


}