問題を正しく理解しているかどうか教えてください.... 特定の行を選択済みとしてマークしたいのですが、選択した行が視覚的にインデントされているように見えます (色とマージンが異なります)。
ここに2つのテクニックがあります:
1 - 行の背景に StateListDrawable を使用する:
その場合、リスト行レイアウト ファイルを作成し、「background」プロパティを StateListDrawable (XML の場合もある) に設定します。これにより、選択された行と選択されていない行の表示状態を切り替えることができます。
StateListDrawable の "drawable" 属性は、9 パッチの PNG で、1 つはマージンを含まない非選択状態用、もう 1 つは選択された状態用です。コンテンツ領域/下の黒い線が PNG の左側に完全に拡張されないようにし、スケーリングされていないマージンである領域を残します。
これを見つけた人々のために、Radley Marx は 9 パッチに関する優れた投稿を投稿しました: http://radleymarx.com/blog/simple-guide-to-9-patch/
ListViews では、"listSelector" (リストの上または後ろに表示される別のエンティティ) をオフにして、代わりに "duplicateParentState" 属性を使用して、行自体が選択を表示できるようにする場合があります (リストはありません)。セレクターが必要です)。これにより、特に特定の行に可変幅の余白を持たせたい場合や、すべて異なって見えるいくつかの種類の行を作成したい場合に、もう少し創造的な自由が得られます。デザインにもよるけど。
2 - 各行にマージンを使用する:
複数のタイプのカラー インジケーターなどが必要であると判断した場合は、margin 属性を提供する別のアプローチを使用する必要がある場合があります (これはおそらくすぐには機能しません)。これは、LayoutParams がレイアウトシステム。正確な詳細を思い出そうとしていますが、これは LayoutParam サブクラスのさまざまなタイプと、MarginLayoutParam (またはそのサブクラス) のプロパティ (たとえば、marginLeft が ListView のレイアウト コードによって無視される可能性があるため) によるものだと思います。マージンのオプションを含まない AbsListView.LayoutParams のインスタンスを使用する必要があります。1 つの方法は、その LayoutParams* でマージンを許可するコンテナー View (サブクラス) 内に行をネストすることです。私はこの余分なネスティングをすることにはならなかったと確信していますが、私は'
ImageView を配置して、色で塗りつぶすことに言及しています。いくつかの代替案があります...おそらく、独自の ListRow クラスを定義し、onDraw() を使用して実際に行の内容を自分で描画し、canvas.draw_xyz() を使用して小さなカラー タブをペイントすることです。複合レイアウトで行を構築するのではなく、残りのテキストなどを描画します。レイアウトを使用する 2 番目の方法は、たとえば軽量の <View layout_height="match_parent" layout_width="4dip" background="#ffff0000" /> を使用することです。
* Android レイアウトの黄金律: 複雑な UI 階層は、特に ListView のようなものでは、パフォーマンスに悪影響を及ぼします。ビューを追加するのではなく、RelativeLayout、drawableTop(etc)、9-patch 画像などを使用することで、これを回避できることがよくあります。
私が誤解していて、上記があまりにも基本的なものである場合は、もう少し詳細を提供してください。おそらく、再現する必要がある正確な部分を示す図です.