Android端如何实现iOS风格ListView/RecyclerView列表效果
实现方案
ListView自带的分割线默认撑满全宽,无法单独控制缩进位置,按以下步骤修改即可实现iOS风格的图标位于分割线左侧的效果:
- 第一步:关闭ListView默认分割线,调整主布局适配iOS风格
替换你现有主布局代码,去掉ListView自带分割线,调整大标题边距匹配iOS规范:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#FFFFFF"> <LinearLayout android:id="@+id/linear1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/textview1" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingStart="16dp" android:paddingEnd="16dp" android:paddingTop="8dp" android:paddingBottom="12dp" android:text="Applications" android:textSize="34sp" android:textStyle="bold" android:textColor="#000000"/> <ListView android:id="@+id/listview1" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="0dp" android:background="@android:color/white" android:divider="@null" android:dividerHeight="0dp" android:choiceMode="none"/> </LinearLayout> </LinearLayout>
- 第二步:自定义列表项布局,手动控制分割线缩进
在res/layout目录下新建item_ios_app.xml作为列表项布局,将图标放在分割线起点左侧,分割线起点和文字左边缘对齐:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingStart="16dp" android:paddingEnd="16dp" android:paddingTop="11dp" android:paddingBottom="11dp" android:background="#FFFFFF"> <!-- App图标,位于分割线左侧区域 --> <ImageView android:id="@+id/iv_app_icon" android:layout_width="40dp" android:layout_height="40dp" android:scaleType="centerCrop" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent"/> <!-- 自定义分割线,起点在图标右侧12dp位置 --> <View android:id="@+id/divider" android:layout_width="0dp" android:layout_height="0.5dp" android:background="#C6C6C8" app:layout_constraintStart_toEndOf="@id/iv_app_icon" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent" android:layout_marginStart="12dp"/> <!-- 应用名称 --> <TextView android:id="@+id/tv_app_name" android:layout_width="0dp" android:layout_height="wrap_content" android:textSize="17sp" android:textColor="#000000" app:layout_constraintStart_toStartOf="@id/divider" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@id/iv_app_icon" android:layout_marginTop="2dp"/> </androidx.constraintlayout.widget.ConstraintLayout>
如果没有引入ConstraintLayout依赖,也可以用水平+垂直嵌套的LinearLayout实现相同布局效果。
- 第三步:修改Adapter适配新布局
在ListView对应的Adapter的getView方法中,inflate上面的item_ios_app.xml布局,分别绑定应用图标、名称即可。如果要更贴近iOS原生效果,可以加一个判断:当前item是列表最后一项时,将divider的visibility设为View.GONE,去掉最后一项底部的多余分割线。
额外适配提示:可以给图标设置8dp圆角,匹配iOS应用图标的圆角风格,视觉还原度更高。
内容的提问来源于stack exchange,提问作者Elizabeth Anter
相关产品推荐
相关产品推荐

