如何使用分隔符实现ViewHolder模式?

时间:2014-10-08 08:25:26

标签: android android-viewholder

我有一个列表视图,显示两种不同的数据,一种是分隔符。每种数据类型都存储在一个数组列表中。因此有两个列表。每个列表的内容通过特殊行(分隔符)与另一个列表的内容分开。第一行也是分隔符行。在getView中,我必须区分正常数据行和分隔​​符行。

// returns true if a separator row must be displayed at pos. 
private boolean isSeperator(int pos) {
        return pos == 0 || pos == data.size() + 1;
}

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

    LayoutInflater infalInflater = (LayoutInflater) this.context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    if(isSeperator(position)) {
        convertView = infalInflater.inflate(R.layout.list_view_seperator, parent, false);
        TextView seperator = (TextView) convertView.findViewById(R.id.tv_list_view_seperator);
        seperator.setText("Seperator");
    }
    else {
        convertView = infalInflater.inflate(R.layout.my_layout, parent, false);

        TextView txtview = (TextView) convertView.findViewById(R.id.foo);
        ImageView icon = (ImageView) convertView.findViewById(R.id.bar);

        MyData myData = (MyData) getItem(position);
        txtview.setText(myData.getName());
        icon.setImageBitmap(myData.getIcon());
    }

    return convertView;
}

首先,我检查是否必须在当前位置显示分隔符。这很好。

我试图实现视图持有者模式,但我经常失败。有人可以告诉我如何在这种情况下使用这种模式,在这种情况下必须考虑包括分隔符在内的不同类型的行吗?

2 个答案:

答案 0 :(得分:3)

如果您想实施sep a rators,我强烈建议您使用Adapter中的 viewType 机制来实现。因此,如果您的适配器已经提供了一种View类型,则可以覆盖:

private final static int TYPE_SEPARATOR = 0;
private final static int TYPE_ITEM = 1;


@Override
public int getViewTypeCount() {
    return 2;
}

@Override
public int getItemViewType(int position) {
    return isSeparator(position) ? TYPE_SEPARATOR : TYPE_ITEM;
}

通过这种方式,当您的getView()被调用时,您将拥有正确的convertView类型(仍然可以是null),您可以使用以下内容:< / p>

private final LayoutInflater mInflater;

public MyAdapter(Context context) {
    mInflater = LayoutInflater.from(context);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (isSeparator(position)) {
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_separator, parent, false);
        }

        setupSeparator(convertView);
    } else {
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_item, parent, false);
        }

        setupListItem(convertView, position);
    }

    return convertView;
}

private boolean isSeparator(int position) {
    return position == 0 || position == data.size() + 1;    // Is the + 1 needed here?
}

答案 1 :(得分:1)

鉴于您确定行是否为分隔符(第一个或最后一个)的条件,似乎它不需要成为此列表的一部分。

如果您需要使用分隔符滚动列表,请考虑使用ListView.addHeader(View view)ListView.addFooter(View view)代替(这些需要在执行ListView.setAdapter(ListAdapter listAdapter)之前设置)。