我在每个项目中创建了一个包含 TextView 和 EditText 的列表。为了填写正确的值,我定义了几个“dataType”。例如,如果我们需要输入日期,我会显示一个日期选择器并在 EditText 中填充返回值,对于 NumericID,我将 numPad 定义为软键盘。
我有一个数据 ArrayList,对于每个项目,我都有这样的信息:一个用于 textView 的字符串、一个 dataType 和一个用于 EditText 的字符串。
我有两个问题,我认为它们是相关的。
第一个,我的数据列表的大小只有 10,所以我的列表中有 10 个项目。但是 getView() 在创建列表时被调用了 20 多次,并且每次软键盘显示/隐藏时,都会为所有“位置”调用此函数。看起来是有线的,不是吗?
第二个是当我使用 arrayAdapter 生成列表时,我的 textViews 看起来不错,但 EditTexts 看起来很随机:在我的数据列表中,我有“ContactName”-“UserName”-“Jane”和“CreateDate”-“Date "-"12/02/12" 等创建列表后,一切正常。但是当我滚动一下我的列表,或者我显示然后隐藏键盘时,我的 EditTexts 与我的 TextView 不匹配,ContactName 的 editText 可能是日期类型......
这是我的代码: setListAdapter(new ArrayAdapter(this, R.layout.itemview, datalist) {
@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;
}
}