如何在Android Studio中实现ListView横向滚动?
实现ListView横向滚动(Item水平排列)的两种方案
ListView默认是垂直排列Item,若要实现Item水平排列、左右横向滚动的效果,有两种可行方案,其中RecyclerView方案性能更优,是官方推荐的做法:
方案一:改造现有ListView实现横向滚动
通过HorizontalScrollView包裹ListView,配合布局参数调整实现需求:
- 修改XML布局文件
将ListView嵌套进HorizontalScrollView,调整宽高属性让列表可横向展开:
<HorizontalScrollView android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="none"> <ListView android:id="@+id/filter_list" android:layout_width="wrap_content" android:layout_height="?android:attr/listPreferredItemHeight" android:scrollbars="none" app:layout_constraintBottom_toTopOf="@id/img_album" app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="40dp" android:layout_marginBottom="20dp" /> </HorizontalScrollView>
注:将ListView的layout_height固定为单个Item的高度,layout_width设为wrap_content,使其根据Item总宽度自适应。
- 修改Item布局(R.layout.row_white_text)
调整TextView的宽高和对齐方式,适配横向排列:
<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/label" style="@style/ServiceTextShadow" android:layout_width="120dp" android:layout_height="match_parent" android:gravity="center" android:padding="12dp" android:textAppearance="?android:attr/textAppearanceListItem" android:textColor="@android:color/white" android:textSize="12sp" android:textStyle="bold"/>
- 适配Adapter逻辑
确保Adapter中每个Item的宽度固定,避免布局错乱。
方案二:改用RecyclerView实现横向滚动(推荐)
RecyclerView天生支持灵活布局方向,且具备Item复用机制,性能远优于改造后的ListView:
- 修改XML布局,替换ListView为RecyclerView
<androidx.recyclerview.widget.RecyclerView android:id="@+id/filter_recycler" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintBottom_toTopOf="@id/img_album" app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="40dp" android:layout_marginBottom="20dp" />
- 在Java代码中设置横向布局管理器
final List<FilterType> filterTypes = FilterType.createFilterList(); // 初始化横向布局管理器 LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false); filter_recycler.setLayoutManager(layoutManager); // 设置适配RecyclerView的Adapter filter_recycler.setAdapter(new FilterRecyclerAdapter(this, filterTypes));
- 编写RecyclerView的Adapter
public class FilterRecyclerAdapter extends RecyclerView.Adapter<FilterRecyclerAdapter.ViewHolder> { private Context mContext; private List<FilterType> mFilterTypes; public FilterRecyclerAdapter(Context context, List<FilterType> filterTypes) { mContext = context; mFilterTypes = filterTypes; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(R.layout.row_white_text, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { FilterType filterType = mFilterTypes.get(position); holder.label.setText(filterType.getName()); // 根据你的数据模型调整字段 } @Override public int getItemCount() { return mFilterTypes.size(); } public static class ViewHolder extends RecyclerView.ViewHolder { TextView label; public ViewHolder(@NonNull View itemView) { super(itemView); label = itemView.findViewById(R.id.label); } } }
- 原Item布局(R.layout.row_white_text)无需修改,可直接复用。
注意事项
- 方案一中的ListView横向滚动存在性能短板,大量数据时Item复用机制失效,易出现卡顿。
- 方案二的RecyclerView是官方推荐的列表组件,性能稳定、扩展性强,优先选择此方案。
内容的提问来源于stack exchange,提问作者Rakesh Saini
相关产品推荐
相关产品推荐

