2012-12-03 3 views
1

조각 내부에 설정된 사용자 지정 ArrayAdapter가 포함 된 Listview가 있습니다. ListView의 첫 번째 행만 설정됩니다.한 번만 작동하는 Android ArrayAdapter

사용자 정의 ArrayAdapters에 대한 자습서를 here에서 문자까지 (필자가 말할 수있는 한) 따르기 때문에 일반적으로 조각이있는 ListView를 사용할 때 공통적 인 문제 일 수 있습니다.

MyFragment :

public class MyFragment extends Fragment { 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.fragment, container, false); 

    ListView myListView = (ListView) v.findViewById(R.id.custom_listview); 

    ArrayList<CustomRow> customList = new ArrayList<CustomRow>(); 
    customList.add(new CustomRow("Test A", "A", "AA"); 
    customList.add(new CustomRow("Test B", "B", "BB"); 
    customList.add(new CustomRow("Test C", "C", "CC"); 

    CustomAdapter customAdapter = new CustomAdapter(getActivity(), R.layout.listitem_custom, customList); 
    myListView.setAdapter(customAdapter); 

    //Inflate the layout for this fragment 
    return v; 

} 

}

그래서 세 개의 행이 목록에 추가됩니다에도 불구하고, 첫 번째을 ListItem는 "테스트 A"를 말한다, "A", "AA". 마지막 두 행은 단순히

사용자 정의 ArrayAdapter와

public class CustomAdapter extends ArrayAdapter<CustomRowItem> { 

Context context; 
ArrayList<CustomRowItem> rowList; 

public CustomAdapter(Context context, int textViewResourceId, ArrayList<CustomRowItem> rowList) { 
    super(context, textViewResourceId, rowList); 
    this.context = context; 
    this.rowList = rowList; 
} 

public static class ViewHolder { 
    public TextView tvText1; 
    public TextView tvText2; 
    public TextView tvText3; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 

    ViewHolder holder; 

    // called when listview is not instantiated yet (first run) 
    if (convertView == null) { 

     // assigns the layout custom_row.xml as the listitem (a single row) 
     LayoutInflater alarmInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     convertView = alarmInflater.inflate(R.layout.listitem_custom, null); 

     holder = new ViewHolder(); 
     holder.tvText1 = (TextView) convertView.findViewById(R.id.textview1); 
     holder.tvText2 = (TextView) convertView.findViewById(R.id.textview2); 
     holder.tvText3 = (TextView) convertView.findViewById(R.id.textview3); 

     convertView.setTag(holder); 

    // called when list view is already instantiated and we are updating the fields 
    } else { 

     holder = (ViewHolder) convertView.getTag(); 

     CustomRowItem newRow = rowList.get(position); 

     if (newRow != null) { 

      holder.tvText1.setText(newRow.getText1()); 
      holder.tvText2.setText(newRow.getText2()); 
      holder.tvText3.setText(newRow.getText3()); 

     } 

    } 


    return convertView; 
} 

}

어떤 아이디어 (텍스트 실제로,도 null이 아닌 아무것도 설정되지 않습니다 IE) 레이아웃에 정의 된 텍스트를 유지 ?

답변

1

getView()의 else 문에 필요한 것보다 많은 코드가 있습니다. 다음과 같아야합니다.

public View getView(int position, View convertView, ViewGroup parent) { 

    ViewHolder holder; 

    // called when listview is not instantiated yet (first run) 
    if (convertView == null) { 

     // assigns the layout custom_row.xml as the listitem (a single row) 
     LayoutInflater alarmInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     convertView = alarmInflater.inflate(R.layout.listitem_custom, null); 

     holder = new ViewHolder(); 
     holder.tvText1 = (TextView) convertView.findViewById(R.id.textview1); 
     holder.tvText2 = (TextView) convertView.findViewById(R.id.textview2); 
     holder.tvText3 = (TextView) convertView.findViewById(R.id.textview3); 

     convertView.setTag(holder); 

     // called when list view is already instantiated and we are updating the fields 
    } else { 
     holder = (ViewHolder) convertView.getTag(); // <-- that's all for here 
    } 

    CustomRowItem newRow = rowList.get(position); 
    if (newRow != null) { 
     holder.tvText1.setText(newRow.getText1()); 
     holder.tvText2.setText(newRow.getText2()); 
     holder.tvText3.setText(newRow.getText3()); 
    } 

    return convertView; 
} 
+0

Works! 고마워 망고! 필드를 예상대로 설정 한 것처럼 보이기 때문에 응용 프로그램을 디버깅 한 후에도 그 점을 발견하지 못했습니다. – Shane

관련 문제