我創建了一個列表,每個項目中都有一個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;
}
}