0

各アイテムに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;
}
}
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.これは、スクロールする前でもgetView()に渡されたConvertViewsをListViewに提供するものです。

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として指定すると、最初の3つのビュー(行)のみが表示され、残りは無視されます。

EditTextの問題は、ifelseブロックが原因である可能性があります。適切にチェックしてください。

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