各アイテムにTextViewとEditTextを含むリストを作成しました。正しい値を入力するために、いくつかの「dataType」を定義しました。たとえば、日付を入力する必要がある場合は、日付ピッカーを表示し、EditTextに戻り値を入力し、NumericIDの場合はnumPadをソフトキーボードとして定義します。
各項目のデータArrayListがあり、textViewの文字列、dataType、EditTextの文字列などの情報があります。
私には2つの問題があり、それらは関連していると思います。
1つ目は、データリストのサイズが10しかないため、リストに10個のアイテムがあります。ただし、getView()は、リストが作成されたときに20回以上呼び出され、ソフトキーボードが表示/非表示になるたびに、この関数がすべての「位置」に対して呼び出されます。有線のようですね。
2つ目は、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;
}
}