ListViewアイテムは、間隔とアイテムのルートマージンの失敗の理由を増やします

最近の設計図に従ってlistViewを作成する場合、listViewアイテム間に左右、上下にギャップがあります。最初のアイデアは、アイテムのルートレイアウトにmarginプロパティを設定することでしたが、listViewにマージンを設定することでした。発効できないので、この研究では失敗します。解決策は、レイアウトのレイヤーを追加するか、ルートレイアウトとしてパディングを設定するか、ルートレイアウトの次のレイアウト設定マージンを追加することです。

以下のレンダリングを直接見てください。
ここに写真の説明を書いてください


1.ここで使用する解決策は、レイアウトとパディングの別のレイヤーをネストすることです

ここに写真の説明を書いてください

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="horizontal"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:paddingTop="5dp"
              android:paddingBottom="5dp"
              android:paddingLeft="8dp"
              android:paddingRight="8dp"
              android:background="@color/transparent">

    <!-- 最上层控制item 的间隔的 -->
    <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="8dp"
            android:background="@drawable/home_listitem_style">

もちろん、下にレイアウトの1つのレイヤーをネストし、マージンと同じ効果を使用することもできます。左右の間隔がない場合は、上下の間隔のみです。別の解決策は、仕切りの高さを設定することです。色は透明です。

2.マージンの失敗の原因に焦点を当てる

これは私が見た説明です
。実際、LinearLayout(子)のマージンは、その親レイアウト(コンテナー)に子レイアウトにx値のマージンを与えるように要求します。

したがって、親レイアウトのLayoutParamsがマージンをサポートしている場合、そのマージンが尊重されて適用されます。

ListViewはデフォルトでAbsListView.LayoutParamsを使用しますが、これにはマージンのサポートは含まれず、高さと幅のみが含まれます。そのため、マージンのparams値は無視されます。

  • 2.1ListViewがAbsListViewを拡張するAbsListViewがレイアウトパラメータを追加する方法を確認する

ここに写真の説明を書いてください

ViewGroupのlayoutParamsは、viewGroupソースコードにあるマージン情報なしで直接使用されます。

ここに写真の説明を書いてください

MarginLayoutParamsというクラスがあり、AbsListViewが見つからなかった実装クラスを引き続きチェックします。

ここに写真の説明を書いてください

しかし、AbsListViewはViewGrouplayoutParamsの実装クラスで見つかりました
ここに写真の説明を書いてください

これは、marginLayoutParamsが実装されていないため、listViewのルートレイアウトのマージン設定が直接無視されることを示しています。サブクラスLinearLayoutのマージン設定は有効ですが、親クラスAbsListView layoutparamsはmarginLayoutParamsを実装せず、関連するマージンを提供しません。値なので、対応する値は設定されていますが、サブクラスでは使用できません。

参考資料:http
//stackoverflow.com/questions/16278159/why-linearlayouts-margin-is-being-ignored-if-used-as-listview-row-view

3.マージンが無効なのに、パディングは有効なのはなぜですか?

私の個人的な理解は次のとおりです。パディングは内側のマージンであり、親クラスは必要ありません。あなたは親であり、サブクラスの特定の距離と値を指定できます。マージンは外側のマージンであり、親が必要です。親の場合、特定の距離を指定します。クラスがサポートしていない場合、対応する値を取得できません。

LinearLayoutはViewGroupを拡張しますViewを拡張します

ビュー自体はパディングプロパティを提供できますが、マージンには親クラスのサポートが必要です。

ここに写真の説明を書いてください

おすすめ

転載: blog.csdn.net/android_freshman/article/details/52077323