2012-06-22 37 views
0

我創建了一個列表,每個項目中都有一個TextView和一個EditText。 爲了填充正確的值,我定義了幾個「dataType」。例如,如果我們需要輸入日期,我會顯示一個日期選擇器,並在EditText中填充返回值;對於NumericID,我將numPad定義爲軟鍵盤。在列表視圖中的項目看起來很隨機

我有一個數據ArrayList,對於每個項目,我有這樣的信息:一個字符串textView,一個數據類型和一個字符串EditText。

我有2個問題,我認爲他們是關聯的。

第一個,我的數據列表大小隻有10個,所以我列出了10個條目。但是,當列表創建時以及每次軟鍵盤顯示/隱藏時,getView()被調用超過20次,此功能在所有「位置」都會被調用。它似乎有線,不是嗎?在我的數據列表中,我有「ContactName」 - 「UserName」 - 「Jane」和「CreateDate」 「 - 」日期「 - 」12/02/12「等。創建列表時,一切都很好。但是,當我滾動了一下我的列表,或者我顯示然後隱藏鍵盤,我的EditTexts與我的TextView不匹配,ContactName的editText可能是Date類型...

這是我的代碼: setListAdapter(new ArrayAdapter(this,R .layout.itemview,數據列表){

 @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View view= convertView; 
      DataHolder data = getItem(position); 
      final ViewHolder vholder ; 
      if (null == view) { 
       LayoutInflater mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       view = mInflater.inflate(R.layout.itemview, null); 
       vholder = new ViewHolder(); 
       vholder.fieldName = (TextView) view.findViewById(R.id.fieldName); 
       vholder.fieldValue = (EditText) view.findViewById(R.id.fieldValue); 

       vholder.fieldValue.setHint(data.detail.getFieldType().getFieldTypeName()); 
       // here I define some properties of the EditText, or I show a date picker then I put the 
       // result in the EditText 
       vholder.fieldValue = (EditText) data.detail.getFieldType().getValue(vholder.fieldValue); 
       view.setTag(vholder); 
       Log.d("convertView is null?", "null "+position); 
      } 
      else{ 
       vholder = (ViewHolder) view.getTag(); 
       Log.d("convertView is null?", "not null "+position); 
      } 

      if(data != null){ 
       vholder.fieldName.setText(data.name); 
       if(vholder.fieldValue == null){ 
        Log.i(vholder.fieldName.getText()+" null", "data type is: "+data.detail.getFieldType().getFieldTypeName().toString());   
       }else{ 
        String fieldValueContent = data.value; 
        if(!fieldValueContent.isEmpty()) 
         vholder.fieldValue.setText(fieldValueContent); 
        // update data if focus changes 
        final String fieldValueText = vholder.fieldValue.getText().toString(); 
        vholder.fieldValue.setOnFocusChangeListener(new View.OnFocusChangeListener() {    
         public void onFocusChange(View v, boolean hasFocus) {   
          if((fieldValueText!=null)&&(!fieldValueText.isEmpty())){ 
           // some update data instructions 
          } 
         } 
        }); 
       } 
      } 

      return view; 
     } 
    }); 
    public class DataHolder{ 
    public FieldDetails detail; 
    public String value; 
    public String name; 
} 
public class ViewHolder{ 
    public TextView fieldName; 
    public EditText fieldValue; 
} 

public class UserName implements FieldType{ 
@Override 
public View getValue(View input) { 
    ((EditText) input).setInputType(InputType.TYPE_TEXT_VARIATION_PERSON_NAME); 
    return input; 
} 
} 

回答

0
First one, my data list's size is only 10, so I've 10 items in my list. But getView() is called more than 20 times 

首次列表視圖創建視圖(行)僅適用於設備可以佔據,如果您滾動列表視圖,它會檢查視圖類型是否改變,如果這樣它會創建新的瀏覽否則會重複使用您的視圖只是通過更換您的數據..

Working of getView()

此外,如果你給列表視圖高度WRAP_CONTENT條前三意見(行)將顯示其餘的將被忽略 ..

問題中的EditText可能是由於你的if else塊。檢查它正確..您正在檢查

if(data=null){ 
    vholder.fieldName.setText(data.name); 
}else{ 
    showing Edit Text // Check it properly 
} 
0
First one, my data list's size is only 10, so I've 10 items in my list. But getView() is called more than 20 times when the list's created 

link

這不是一個問題,有訂單就完全不保證其中getView()將會被調用也不會有多少次。In your particular case you are doing the worst thing possible with a ListView by giving it a height=wrap_content. This forces ListView to measure a few children out of the adapter at layout time, to know how big it should be.即使在滾動之前,這也是ListView與您看到的傳遞給getView()的convertView。

Focusable EditText inside ListView

相關問題