2012-05-25 69 views
0

我有一個帶有自定義適配器的Android應用程序,該適配器擴展了Cursor Adapter。
我重寫了CursorAdapter的bindView和newview方法。我的每個ListView行都包含一個EditText。當我在EditText中輸入一些文本並滾動ListView時,EditText文本的內容將移動到另一個EditText。
任何人都可以幫助我解決這個問題,以便如何防止EditText在ListView向下滾動時重用其內容。ListView Scroll上的EditText內容更改


由於事先


下面是代碼:如果您滾動它是一個的搞亂您的觀點後循環有問題

 private class AddScreenArrayAdapter extends ArrayAdapter<AddScreenItems>{ 

    ViewHolder viewHolder = null; 
    public String[] holder_values; 

public AddScreenArrayAdapter(Context context, int textViewResourceId, 
     List<AddScreenItems> objects) { 
    super(context, textViewResourceId, objects); 
    holder_values = new String[objects.size()]; 

    // TODO Auto-generated constructor stub 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 

    View v = convertView; 
    if (v == null) { 
     LayoutInflater vi = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.additem_row, null); 
     viewHolder = new ViewHolder(); 
     viewHolder.label = (TextView) v.findViewById(R.id.label_add_item); 
     viewHolder.dbName=(TextView)v.findViewById(R.id.dbtable_name); 
     viewHolder.value = (EditText) v.findViewById(R.id.value_add_item); 
     viewHolder.value.addTextChangedListener(new TextWatcher() 
     { 

      @Override 
      public void afterTextChanged(Editable arg0) { 
       // TODO Auto-generated method stub 
       holder_values[viewHolder.ref]= arg0.toString(); 

      } 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, 
        int count, int after) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, 
        int before, int count) { 
       // TODO Auto-generated method stub 

      } 

     }); 
     v.setTag(viewHolder); 
    } 
    else{ 
     viewHolder = (ViewHolder) v.getTag(); 
    } 
    AddScreenItems addScreenItems = addScreenItemsList.get(position); 
    if(addScreenItems!=null) 
    { 
     viewHolder.label.setText(addScreenItems.labelname); 
     viewHolder.dbName.setText(addScreenItems.databaseTableName); 
    // viewHolder.ref = position; 
     if (holder_values[position] != null) 
     { 
      viewHolder.value.setText(holder_values[position]); 
     } 

     else { 
      viewHolder.value.setText(""); 
     } 


    } 
    return v; 


} 

    } 

      static class ViewHolder { 
    public TextView label; 
    public EditText value; 
    public TextView dbName; 
    int ref; 
     } 
+0

這可能與您處理視圖回收的方式有關。你可以從適配器發佈你的'getView()'方法嗎? – MattDavis

+0

剛剛發佈我的代碼。 – user1276092

回答

0

。你基本上需要設置一個數組來保存EditTexts的內容,所以當你滾動時他們不會搞砸。

下面是我給出的關於類似主題的另一個答案的鏈接。它應該爲你指明方向。 SO Answer

編輯

我用setOnFocusChangeListener當用戶結束在EditText上框中選擇一個條目來運行代碼。

qty.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
@Override 
public void onFocusChange(View v, boolean hasFocus) { 
    if (!hasFocus) { 
     LinearLayout parent = (LinearLayout) v.getParent(); 
     EditText qtyTemp = (EditText) parent.findViewById(R.id.qty); 
     quantity[pos] = qtyTemp.getText().toString(); 
    } 
} 
}); 
+0

我更新了我的代碼,因爲我使用了ArrayAdapter而不是Cursor Adapter,但仍然面臨這個問題。你能檢查我的代碼並幫助我解決問題嗎? – user1276092

+0

它看起來對我好。我從來沒有在TextWatchers方面取得過很大的成功,我通常使用'setOnFocusChangeListener',所以當用戶啓動edittext框時它就起作用了。我會在我的答案中添加一個小例子。 – Barak