0

私のアプリでは、リスト ビューでデータを表示します。以下のようになります。

ここに画像の説明を入力

リスト ビューの各行は異なります (つまり、ビュー構造が異なります)。ただし、すべての行は1つから多くのサブビューで構成されています(すべてのサブビューは同じです)。

問題: xml から行を膨らませようとする場合、1. 2 つのサブビュー 2. 3 つのサブビュー 3. 5 つのサブビューなどの xml が必要です。

行を動的に構築しようとすると、ホルダー パターンや Listview のビューの再利用性を利用できなくなります。そして、返されたビューのサブビューの数が必要よりも少ない場合はサブビューを構築するか、サブビューが必要以上である場合は削除します。

一言で言えば、ビューの再利用性やホルダーパターンを妨げずにリストビューに異なるビューを表示するにはどうすればよいですか?

編集:

ArrayAdapter を拡張し、getView、getViewTypeCount、getItemViewType をオーバーライドしました

@Override
public int getItemViewType(int position) {
    return mListItems.get(position).getViewToBeRenderened().getViewId();
}

@Override
public int getViewTypeCount() {     
    return AppConstants.VwViewTypes.values().length;
}

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

    final VWListItem listItem = mListItems.get(position);
    if(listItem == null || listItem.getViewToBeRenderened() == null){
        return convertView;
    }       
    VWView renderingView = listItem.getViewToBeRenderened();

    if(convertView == null ){           
        convertView = renderingView.buildView(mContext.appContext);

    }

                ...
}

このアプローチは、異なる行ビューが 2 ~ 3 つしかなかった当初は有効でした。これらの行ビューごとに、異なる xml レイアウトと、ビルドおよびインフレートする対応するクラスがありました。

しかし、現在、そのようなビューの数が増えているため、追加の新しい行ビューごとにレイアウトとクラスを作成したくありません。代わりに、既存のレイアウトとクラスを再利用して、それらの上に構築したいと考えています。より良い解決策があれば、それも受け入れます。

4

2 に答える 2

4

さまざまな種類のビューを管理する必要がある場合は、オーバーライドする必要がgetViewTypeCount()ありgetItemViewType()、によって返される int に等しい数の convertViews を受け取りますgetViewTypeCount()。たとえば、 2 が返された場合、 2 differents が返されますconvertView

于 2013-07-10T09:06:31.363 に答える
0

ListView は、各行に同様の繰り返しパターンがある場合に、コーダーの負担を軽減するために使用されると思われます。はい、わずかなバリエーションgetViewTypeを実装するのが正しい選択ですが、問題に対するより良い解決策があると思います。多くのカスタマイズ要件がある場合は、独自の linearlayout を作成する必要があります。listview 自体は、作成するのにコストのかかるオブジェクトであることに注意してください。カスタムの線形レイアウトを作成することはそれほど難しくありません。

于 2013-07-10T09:21:13.383 に答える