listvview を使用して上記のレイアウトを実現したいと考えています。いくつかのセクション (動的に生成) といくつかのアイテムがあります。各セクションを独自の背景にカプセル化する必要がありますが、ユーザーが小さなセクションだけでなく、通常のリストビューとしてすべてをスクロールできるようにする必要があります。(そのため、各セクションに N リストビューを実装することは除外されています)
私の質問は、このようなレイアウトをどのように構築しますか?
難しくありません。私はこれを ListView で行いましたが、リサイクルに取り組んでいます。このコードでは、すべてのリスト項目の色を緑と赤の間で切り替えます。
@Overrid
public int getItemViewType(int position) {
if((position % 2) == 0) {
return TYPE_GREEN;
} else {
return TYPE_RED;;
}
@Override
public int getViewTypeCount() {
return numberOfColors;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
if (type == TYPE_RED) {
convertView = mInflater.inflate(R.layout.list_item_red,
null);
} else if (type == TYPE_GREEN) {
convertView = mInflater.inflate(R.layout.list_item_green,
null);
}
}
最も簡単な解決策は、ListView をまったく使用しないことです。一連の LinearLayout コンテナーを使用して、アイテムを手動で追加します。このオプションはビューのリサイクルを使用しないため、リストが長い場合はパフォーマンスが低下することに注意してください。
パフォーマンスの問題で LinearLayouts が妨げられる場合は、目標を達成するためにリスト項目を巧妙に操作する必要があります。リスト内のすべてのアイテムの背景を同様の背景に設定し、内側のビュー内のアイテムのコンテンツをオフセットすることで、セクションに連続した背景があるように見せることができます。セクションの最初のアイテムの上部、セクションの最後のアイテムの下部、およびすべてのアイテムの側面をパディングします。錯覚を維持するために、ListView ディバイダを削除し、リスト アイテム内のビューに設定します。リストを操作し始めると、セレクターが変に見えるので、カスタマイズしたくなるでしょう。
---
|-------------------------| |
|#########################| |
|##|-------------------|##| |
|##| |##| Actual list item
|##| |##| |
|##| |##| |
|##|-------------------|##| ---
|##| |##| |
|##| |##| Actual list item
|##| |##| |
|##|-------------------|##| ---
|##| |##| |
|##| |##| |
|##| |##| Actual list item
|##|-------------------|##| |
|#########################| |
|-------------------------| |
---
|-------------------------| |
|@@@@@@@@@@@@@@@@@@@@@@@@@| |
|@@|-------------------|@@| |
|@@| |@@| Actual list item
|@@| |@@| |
|@@| |@@| |
|@@|-------------------|@@| ---
|@@| |@@| |
|@@| |@@| |
|@@| |@@| Actual list item
|@@|-------------------|@@| |
|@@@@@@@@@@@@@@@@@@@@@@@@@| |
|-------------------------| |
---
ur ref については、次のアプリケーションで同じことを実装しました
これが私が実装した方法です。1)すべてのデータをArraylistに保持しました。例えば:
private String HEADING_TAG="heading";
private String ITEM_TAG="item" ;
ArrayList<String> data=
new ArrayList<String>();
data.add( HEADING_TAG+"@selector");
data.add( ITEM_TAG+ "@item1")
/* in the above line "heading" is a tag, just to know that the
following listitem is a heading.
"@" is a separator using which we wl split the string later in
the adapter*/
2) カスタム アダプターを実装し、getView() メソッドをオーバーライドします。注: リストの長さをアダプターに渡します。3) getView() メソッド内のデータ リストにアクセスすると、getView メソッドで position という引数が使用可能になります。その変数を使用してリストを繰り返します。例えば:
getView(....,....,int pos,....)
{
String temp[]= data.get(position).split("@");
if(temp[0].equals( HEADING_TAG ))
{
// change the background to the layout which u r inflating.
// Set the heading to the textview or what ever view u defined
//the layout
}
else if (temp[1].equals( ITEM_TAG ) )
{
// set the item to the view
}
}
お役に立てれば...