각 항목에 TextView 및 EditText가있는 목록을 만들었습니다. 올바른 값을 채우기 위해 몇 가지 "dataType"을 정의했습니다. 예를 들어 날짜를 입력해야하는 경우 날짜 선택 도구를 표시하고 EditText에 반환 값을 채우고 NumericID에 대해서는 numPad를 소프트 키보드로 정의합니다.목록보기의 항목이 너무 무작위로 보입니다.
데이터 ArrayList를 가지고 있는데 각 항목에 대해 textView의 String, EditText의 String 및 String에 대한 정보가 있습니다.
나는 2 가지 문제가 있으며, 그것들은 연관되어 있다고 생각합니다.
처음에는 데이터 목록의 크기가 10에 불과하므로 내 목록에 10 개의 항목이 있습니다. 그러나 getView()는리스트가 생성되고 소프트 키보드가 표시/숨기기 될 때마다이 함수가 모든 "위치"에 대해 호출 될 때 20 회 이상 호출됩니다. 유선 같아 보이지?
두 번째는 arrayAdapter를 사용하여 목록을 생성 할 때 textViews가 좋지만 EditTexts가 너무 무작위로 보입니다. 내 데이터 목록에서 "ContactName"- "UserName"- "Jane"및 "CreateDate "-"날짜 "-"12/02/12 "등. 목록을 만들면 모두 좋습니다. 그러나 약간의 목록을 스크롤하거나 키보드를 숨기고 내 EditTexts가 TextView와 일치하지 않으면 ContactName의 editText가 Date 유형이 될 수 있습니다 ...
여기 내 코드는 다음과 같습니다. 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;
}
}