我有一个Listview,其中包含一个设置在片段内的自定义ArrayAdapter。只设置了ListView中的第一行。
将ListViews与片段一起使用时,这可能是一个常见的问题,因为我已经按照自here的自定义ArrayAdapters教程一直到字母(据我所知)。
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表示“Test A”,“A”,“AA”。最后两行只是保持文本在布局中的定义(即文本实际上从未设置为任何内容,甚至不是null)
自定义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;
}
}
有什么想法吗?
答案 0 :(得分: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;
}