4

私の質問は、rowSpan と colSpan をサポートする GridView を作成することです。スタックオーバーフローなどで探しました。同様の質問がいくつかありますが、有効な回答はありません。

これを行う 1 つの方法は、さまざまな行タイプでカスタム ListView アダプターを実装することです。getItemViewType(int position) を使用すると、このようなシナリオの最適化に役立つ可能性がありますが、ViewTypes が多すぎてリサイクルが非効率になるのではないかと心配しています。私は3列のグリッドと4または5のrowSpansを持ついくつかの要素を持ちたいので.

別の方法では、ListView を拡張して、それらの「カード」に独自のリサイクラーを持たせることができます。つまり、次のような行がある場合:

    ##..//
    ##**//
    ##====
    ##++--  

通常、ListView の単一の行ですが、独自の子と独自の階層を持つ必要があります。この行は本当に一意であるため、再利用されることはありません。カスタム リサイクラーを使用する場合、すべてのカード (上記のアスキー アートの「#」、「=」、または「+」など) は、サイズに固有のごみ箱に移動する必要があります (「#」の場合は 4x2、 '=' ) であり、リサイクルの可能性ははるかに高くなります。

おそらく、ListView を使用せず、Scroller を使用してまったく新しいビューを実装し、独自のリサイクラーとサーバー側で決定された各要素の絶対位置を使用することをお勧めします。

より良いアイデアを思いつくか、少なくともそれぞれの方法を実装するのがどれほど難しいかについてアドバイスをくれると思うので、私はあなたにこれを求めています.

4

1 に答える 1

0

Java コード

private LinearLayout addNewSpannedView(Integer resourceId, ViewGroup rootElement) {
    return (LinearLayout) ((ViewGroup) getLayoutInflater().inflate(resourceId, rootElement, true)).getChildAt(rootElement.getChildCount() - 1);
}
// set columnSpan depending on some logic (gridLayout is the layout to add the view's to -> in my case these are LinearLayouts)
shape = addNewSpannedView(columnSpan == 1 ? R.layout.grid_ll_col_span_1 : R.layout.grid_ll_col_span_2, gridLayout);

grid_ll_col_span_2.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="@dimen/shapeWidth"
    android:layout_height="wrap_content"
    android:layout_columnSpan="2"/>
于 2015-07-26T07:12:15.713 に答える