El elemento ListView aumenta el espaciado y el motivo de la falla del margen de la raíz del elemento

Al escribir listView de acuerdo con el dibujo de diseño recientemente, hay un espacio entre los elementos de listView, izquierda y derecha, arriba y abajo. La idea inicial era establecer la propiedad margin en el diseño raíz del elemento, pero el margen en listView no puede surtir efecto, por lo que falla según el motivo de esta investigación. La solución es agregar una capa de diseño, establecer el relleno como el diseño raíz o agregar el siguiente margen de configuración del diseño del diseño raíz.

Mire directamente las representaciones a continuación:
Escriba la descripción de la imagen aquí


1. La solución, lo que uso aquí es anidar otra capa de diseño y relleno

Escriba la descripción de la imagen aquí

<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">

Por supuesto, también puede optar por anidar una capa de diseño debajo y usar el mismo efecto como margen. Si no hay espaciado izquierdo y derecho, solo el espaciado superior e inferior. Otra solución es establecer la altura del divisorAltura y el color es transparente.

2. Céntrese en la causa de la falla del margen

Esta es una explicación que vi.
El hecho es que el margen de LinearLayout (hijo) le pide a su diseño principal (contenedor) que le dé al diseño hijo un margen de valor x.

Entonces, si los LayoutParams de los diseños principales admiten los márgenes, ese margen se respeta y aplica.

ListView usa AbsListView.LayoutParams de forma predeterminada, que no incluye ningún soporte de margen, solo el alto y el ancho, por eso, simplemente ignora el valor de los parámetros para los márgenes.

  • 2.1 ListView extiende AbsListView Verifique cómo AbsListView agrega parámetros de diseño

Escriba la descripción de la imagen aquí

El layoutParams de ViewGroup se usa directamente, sin la información de margen, que se encuentra en el código fuente de viewGroup

Escriba la descripción de la imagen aquí

Hay una clase llamada MarginLayoutParams, continúe verificando su clase de implementación, que no encontró AbsListView,

Escriba la descripción de la imagen aquí

Pero AbsListView se encontró en la clase de implementación en ViewGroup layoutParams
Escriba la descripción de la imagen aquí

Esto muestra que la configuración de margen en el diseño raíz de listView se ignora directamente, porque marginLayoutParams no está implementado. Aunque la configuración de margen en la subclase LinearLayout es válida, la clase principal AbsListView layoutparams no implementa marginLayoutParams y no proporciona el margen relevante value, por lo que el valor correspondiente no está disponible en la subclase, aunque se ha establecido.

Materiales de referencia:
http://stackoverflow.com/questions/16278159/why-linearlayouts-margin-is-being-ignored-if-used-as-listview-row-view

3. ¿Por qué el margen no es válido, pero el relleno es válido?

Mi comprensión personal es: el relleno es el margen interno, no necesita la clase principal, usted es el padre, puede proporcionar la distancia y el valor específicos de la subclase, y el margen es el margen exterior, necesita que el padre proporcionar la distancia específica, cuando el padre El valor correspondiente no se puede obtener si la clase no lo admite.

LinearLayout extiende ViewGroup extiende View

La vista en sí misma puede proporcionar propiedades de relleno, pero el margen necesita el soporte de la clase principal.

Escriba la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/android_freshman/article/details/52077323
Recomendado
Clasificación