2012-06-22 4 views
0

각 항목에 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; 
} 
} 

답변

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 

처음으로 목록보기 장치가 차지할 수는 목록보기를 스크롤하는 경우는보기 유형은 그래서 새로운보기를 만듭니다 경우 변경 여부를 확인에만있는 뷰 (행)을 생성 그렇지 않으면 그냥 데이터를 교체하여보기를 다시 사용합니다 ..

Working of getView()

을 또한 당신이 wrap_content로 목록보기 높이를 주면에만 처음 세 개의 뷰 (행)

글고 치기에 문제가있을 수 있습니다

인해 다른 블록이 .. 제대로 확인하면 ... 당신의 아르 체크

if(data=null){ 
    vholder.fieldName.setText(data.name); 
}else{ 
    showing Edit Text // Check it properly 
} 
에 .. 나머지는
를 무시됩니다 표시됩니다
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 

등이 문제가되지 않습니다 link

당은 전혀의 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()에 전달 된 것으로 보이는 convertView가있는 ListView를 제공합니다.

Focusable EditText inside ListView

관련 문제