0

2 つの異なる種類のデータを表示するリスト ビューがあります。1 つはセパレータです。各データ型は、1 つの配列リストに格納されます。したがって、2 つのリストがあります。各リストの内容は、特別な行 (セパレーター) によって他のリストと区切られています。最初の行は区切り行でもあります。では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;
}

まず、現在の位置にセパレーターを表示する必要があるかどうかを確認します。これはうまくいきます。

ビュー ホルダー パターンを実装しようとしましたが、常に失敗します。セパレータを含むさまざまなタイプの行を考慮する必要がある場合に、このパターンを使用する方法を誰かに教えてもらえますか?

4

2 に答える 2

3

sep a rators を実装する場合は、 のviewTypeメカニズムを使用して実装することを強くお勧めしますAdapter。したがって、すでに 1 つのタイプの を提供しているアダプターがある場合は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)、次のようなもので問題ないはずです。

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?
}
于 2014-10-08T09:21:40.283 に答える
1

行がセパレーター (最初または最後) であるかどうかを判断する条件を考えると、このリストの一部である必要はないようです。

リストをスクロールするためにセパレーターが必要な場合は、代わりにListView.addHeader(View view)andを使用することを検討してください(これらは を実行する前に設定する必要があります)。ListView.addFooter(View view)ListView.setAdapter(ListAdapter listAdapter)

于 2014-10-08T08:39:21.963 に答える