2015-06-05 3 views
2

У меня есть listView, который я заполняю с помощью пользовательского адаптера. Теперь проблема в том, что у меня есть editText внутри ListView и в событии textchange этого editText, который я пытаюсь обновлять модель и отображать новые значения, но когда-либо listitem editText, я меняю его, всегда находит отражение в первом списке. Мой GetView код выглядит так:Android: EditText внутри ListView всегда обновляет первый элемент в listview

public View getView(int position, View convertView, ViewGroup parent) { 
     View view = convertView; 
     if (view == null) { 
      view = lInflater.inflate(R.layout.list_style_task 
        , parent, false); 
     } 

      p = getProduct(position); 


      tvAQuantity=((TextView) view.findViewById(R.id.tvAQuantity)) ; 
     ((TextView) view.findViewById(R.id.tvMaterial)).setText(p.getMName()); 
     ((TextView) view.findViewById(R.id.tvTask)).setText(p.getTName()); 
      tvBQuantity=((TextView) view.findViewById(R.id.tvBQuantity)) ; 
      tvBQuantity.setText(p.getBQ()); 
      etQuantity=(EditText)view.findViewById(R.id.etTaskQuantity); 
     tvAQuantity.setText(p.getAQ()); 
     etQuantity.addTextChangedListener(new TextWatcher() { 
      @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(!s.equals("")) 
       { 
        if (Integer.parseInt(s.toString()) <= Integer.parseInt(p.getBQ().toString())) { 
         String str= s.toString(); 

         p.setAQ(str); 
         notifyDataSetChanged(); 
        } else { 


         p.setAQ(p.getBQ().toString()); 
         notifyDataSetChanged(); 

        } 
       } 

      } 


     }); 

    // CheckBox cbBuy = (CheckBox) view.findViewById(R.id.checkbox); 
     //cbBuy.setOnCheckedChangeListener(myCheckChangList); 
    // cbBuy.setTag(position); 
    // cbBuy.setChecked(p.selected); 
     return view; 
    } 

Моя модель выглядит так:

/** 
* Created by Mubashir.gul on 29/05/2015. 
*/ 

public class LItem { 

    private String MName = ""; 
    private String MNo = ""; 
    private String TName = ""; 
    private String TNo = ""; 
    private String BQ = ""; 
    private String AQ=""; 
    public LItem() { 
     MName = ""; 
     MNo = ""; 
     TName = ""; 
     TNo = ""; 
     BQ = ""; 
     AQ=""; 
    } 

    public LItem (String _MName, String _MNo,String _TName, String _TNo,String _BQ,String _AQuantity) { 
     MName = _MName; 
     MNo = _MNo; 
     TName = _TName; 
     TNo = _TNo; 
     BQ = _BQ; 
     AQ=_AQuantity; 
    } 

    @ Override 
    public String toString() {// Why should override toString()? Because the adapter display data if the incoming adapter object is not a string of case, directly on the use of the object. ToString() 
     // TODO Auto-generated method stub 
     return MName; 
    } 

    public String getMName() { 
     return MName; 
    } 
    public String getMNo() { 
     return MNo; 
    } 
    public String getTName() { 
     return TName; 
    } 
    public String getTNo() { 
     return TNo; 
    } 
    public String getBQ() { 
     return BQ; 

    } 
    public void setAQ(String Aq) 
    { 
     this.AQ=Aq; 

    } 
    public String getAQ() 
    { 

     return this.AQ; 

    } 
} 
+0

первую очередь использования 'ViewHolder' модели в ListView –

ответ

0

Изменить

View view = convertView; 
    if (view == null) { 
     view = lInflater.inflate(R.layout.list_style_task 
       , parent, false); 
    } 

в

View view = convertView; 
     view = lInflater.inflate(R.layout.list_style_task 
       , parent, false); 

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

0

Вы должны создать пользовательский класс для слушателя: -

private class CustomTextWatcher implements TextWatcher { 
    private EditText mEditText; 

    public CustomTextWatcher(EditText et) { 
     mEditText = et; 
    } 

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

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

    public void afterTextChanged(Editable s) { 

     int pos = (Integer)exList.getTag(); 

     p = getProduct(pos); 

     if (!s.equals("")) { 
      if (Integer.parseInt(s.toString()) <= Integer.parseInt(p 
        .getBQ().toString())) { 
       String str = s.toString(); 

       p.setAQ(str); 
       notifyDataSetChanged(); 
      } else { 

       p.setAQ(p.getBQ().toString()); 
       notifyDataSetChanged(); 

      } 
     } 

    } 
} 

И использовать это добавить следующую строку: -

editText.setTag(position); 
    editText.addTextChangedListener(new CustomTextWatcher(editText)); 
+0

р = getProduct (mEditText.getTag()); эта строка создает ошибку: не может быть применена к java.lang.object – killer

+0

та же ошибка из этой инструкции. – killer

+0

решил конструктор с измененной ошибкой: public CustomTextWatcher (EditText et, int ps) { mEditText = et; pos = ps; } после этого использовал его следующим образом: p = (LItem) getProduct (pos); – killer

Смежные вопросы