2013-05-31 3 views
-1

Привет, я знаю, что этот вопрос появился здесь, но ответы мне не помогли. Итак, у меня есть активность со списком, ограниченным ArrayListAdapter для моего класса ZamowieniePoz.Android ListView And EditText

public class ZamowieniePoz { 

private int _idZamowienie; 
private String _plu; 
private String _nazwa; 
private String _ilosc; 
private String _jm; 
private String _uwagi; 
private String _dataSync; 
private int _isSync; } 

Это мой ListView definitione:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:scrollbars="vertical"> 


    <ListView 
     android:id="@+id/listView" 
     android:scrollbars="vertical"   
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="fill_vertical" 
     android:layout_alignParentTop="true" /> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:layout_below="@id/listView" > 

     <Button 
      android:id="@+id/btnWyslij" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="WYŚLIJ ZAMÓWIENIE" /> 

     <Button 
      android:id="@+id/btnPowrotZamowienieAdd" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="POWRÓT" /> 

    </LinearLayout> 

Это ListView строка:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/txtPlu" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 


    <EditText 
     android:id="@+id/txtIlosc" 
     android:layout_width="100dp" 
     android:layout_height="wrap_content"   
     android:layout_toRightOf="@id/txtPlu" 
     android:layout_marginLeft="25sp" 
     android:lines="1" 
     android:inputType="numberDecimal" /> 
</RelativeLayout> 

Это ArrayListAdapter:

public class ZamowieniePozArrayAdapter extends ArrayAdapter<ZamowieniePoz> { 
     Context context; 
     int layoutResourceId; 
     ArrayList<ZamowieniePoz> data=null; 

     public ZamowieniePozArrayAdapter(Context context, int layoutResourceId, ArrayList<ZamowieniePoz> data) { 
      super(context, layoutResourceId, data); 
      this.layoutResourceId=layoutResourceId; 
      this.context=context; 
      this.data = data; 

     } 

     @Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
      View row = convertView; 
      ZamowienieHolder holder = null; 

      if (row == null) {    
       LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
       row=inflater.inflate(layoutResourceId, parent, false); 

       holder = new ZamowienieHolder(); 
       holder.txtPlu = (TextView)row.findViewById(R.id.txtPlu); 
       holder.txtIlosc=(EditText)row.findViewById(R.id.txtIlosc); 

       holder.txtIlosc.addTextChangedListener(new TextWatcher() { 

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

        } 

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

        } 

        @Override 
        public void afterTextChanged(Editable s) {     
          data.get(position).setIlosc(s.toString()); 
        } 
       }); 

       row.setTag(holder); 
      } 
      else{ 
       holder = (ZamowienieHolder)row.getTag(); 
      } 

      ZamowieniePoz zamowieniePoz = data.get(position); 
      holder.txtPlu.setText(zamowieniePoz.getPlu()); 
      holder.txtIlosc.setText(zamowieniePoz.getIlosc()); 

      return row; 

     } 


     static class ZamowienieHolder { 
      TextView txtPlu; 
      EditText txtIlosc; 
     } 

} 

Это, как я связала адаптер к ListView:

final DbHandler db = new DbHandler(ZamowienieAddActivity.this); 

     listView = (ListView) findViewById(R.id.listView); 

     arrayZamowieniePoz = db.getAllZamowienie();  

     arrayAdapterZamowieniePoz = new ZamowieniePozArrayAdapter(this, R.layout.zamowienie_add_list_items, arrayZamowieniePoz); 

     listView.setAdapter(arrayAdapterZamowieniePoz); 

Так это он. Проблема в том, что первая строка listView дублирует последнюю строку. Я думаю, что что-то не так с этой строкой кода data.get (position) .setIlosc (s.toString()); в getView в afterTextChange.

Пожалуйста, помогите мне. Я не знаю, что не так. Спасибо.

ответ

0

Ваш TextWatcher конкретизируется в то же время, как ряд View

Если вы получаете переработанной View (row != null), в следующем коде

@Override 
public void afterTextChanged(Editable s) {     
    data.get(position).setIlosc(s.toString()); 
} 

position будет по-прежнему ссылаться на позицию оригинал вид.

Для каждой итерации вам необходимо сбросить TextWatcher, не забудьте позвонить removeTextChangeListener() перед тем, как позвонить addTextChangeListener().


Простая реализация может быть сделано, как, что, хотя instanciating TextWatch каждый раз, когда не может быть оптимальным:

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    ZamowienieHolder holder = null; 

    if (row == null) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     row = inflater.inflate(layoutResourceId, parent, false); 

     holder = new ZamowienieHolder(); 
     holder.txtPlu = (TextView)row.findViewById(R.id.txtPlu); 
     holder.txtIlosc = (EditText)row.findViewById(R.id.txtIlosc); 

     row.setTag(holder); 
    } 
    else { 
     holder = (ZamowienieHolder)row.getTag(); 
    } 

    // Remove previous TextWatcher if any 
    if (holder.textWatcher != null) { 
     holder.txtIlosc.removeTextChangedListener(holder.textWatcher); 
    } 

    // Create the TextWatcher corresponding to this row 
    holder.textWatcher = new TextWatcher() { 
     @Override 
     public void afterTextChanged(Editable s) { 
      data.get(position).setIlosc(s.toString()); 
     } 

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

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

    holder.txtIlosc.addTextChangedListener(holder.textWatcher); 

    ZamowieniePoz zamowieniePoz = data.get(position); 
    holder.txtPlu.setText(zamowieniePoz.getPlu()); 
    holder.txtIlosc.setText(zamowieniePoz.getIlosc()); 

    return row; 
} 
+0

Я добавил TextWatcher и сделать removeTextChangeListener перед тем addTextChangeListener и я doensn't изменить что-либо. Можете ли вы опубликовать пример, как сделать это по-своему. Может быть, я делаю что-то неправильно. THX – silaros88

+0

@ user2440158 Отредактировано мое сообщение с примером – nicopico

+0

My God. Никопико вы сделали мой день. ОНО РАБОТАЕТ !!! – silaros88

0

Bellow code using your arrayAdaper.

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="@dimen/padding_small" 
    android:layout_marginTop="@dimen/padding_small" > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingRight="@dimen/padding_large" 
     android:paddingTop="@dimen/padding_small" 
     android:text="Rename To: " 
     android:textColor="@color/black" 
     android:textStyle="bold" > 
    </TextView> 

    <EditText 
     android:id="@+id/ZoneRenameEditText" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:background="@drawable/relay_txtbox" 
     android:ems="2" 
     android:maxLength="50" 
     android:paddingLeft="5dip" 
     android:paddingRight="5dip" 
     android:singleLine="true" 
     android:text="" /> 
</LinearLayout> 

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="3dip" 
    android:gravity="center_vertical|right" > 

    <ImageView 
     android:id="@+id/ZoneDoneImageView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="@dimen/padding_large" 
     android:background="@drawable/bk_done_button" /> 
</LinearLayout>