Android ArrayAdapter 只工作一次



我有一个列表视图,其中包含一个设置在片段内的自定义 ArrayAdapter。仅设置列表视图中的第一行。

在一般情况下,当将

ListViews与片段一起使用时,这可能是一个常见问题,因为我已经遵循了从这里到字母的自定义ArrayAdapters教程(据我所知)。

我的片段:

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;
}

}

因此,即使将三行添加到列表中,也只有第一个列表项显示"测试 A"、"A"、"AA"。最后两行只是保留布局中定义的文本(即文本实际上从未设置为任何内容,甚至不为 null)

自定义阵列适配器

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;
}

}

有什么想法吗?

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;
}

最新更新