0

我在每个项目中创建了一个包含 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;
}
}
4

2 回答 2

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 

根据链接

这不是问题,绝对不能保证调用 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() 的原因。

ListView 内的可聚焦 EditText

于 2012-06-22T14:48:01.983 回答
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 

列表视图第一次只为哪个设备可以占用创建视图(行),如果您滚动列表视图,它将检查视图类型是否已更改,如果是,它将创建新视图,否则它将仅通过替换重新使用您的视图你的数据..

getView() 的工作

此外,如果您将列表视图高度指定为wrap_content ,则只会显示前三个视图(行),其余的将被忽略..

EditText 中的问题可能是由于您的 if else 块..正确检查..您正在检查

if(data=null){
  vholder.fieldName.setText(data.name);
}else{
   showing Edit Text // Check it properly
}
于 2012-06-22T15:02:50.890 回答