You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android RecyclerView时段布局实现:自定义XML还是第三方库?

实现时段类型显示的解决方案

完全不需要依赖第三方库哈,你直接通过自定义RecyclerView的item布局(也就是你现有的time_slot_layout.xml)就能搞定显示时段类型的功能,下面给你具体的修改步骤和建议:

1. 更新时间槽Item布局

原来的布局只有时间显示,我们可以在时间下方添加一个用于展示时段类型的TextView,视觉上更清晰;如果想要更醒目的效果,也可以给时段类型做标签样式处理:

基础垂直布局版本

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:background="?android:attr/selectableItemBackground"
    android:layout_height="wrap_content"
    android:padding="8dp">

    <!-- 核心时间显示 -->
    <TextView
        android:id="@+id/time_slot"
        android:layout_width="match_parent"
        android:layout_height="35dp"
        android:textAlignment="center"
        android:textSize="20dp"
        android:textColor="@color/black_updated"/>

    <!-- 新增时段类型显示 -->
    <TextView
        android:id="@+id/slot_type"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAlignment="center"
        android:textSize="12dp"
        android:textColor="@color/text_grey"
        android:layout_marginTop="4dp"/>
</LinearLayout>

带圆角标签的优化版本

如果想让时段类型更醒目,可以给它添加圆角背景:

<!-- 带圆角背景的时段类型TextView -->
<TextView
    android:id="@+id/slot_type"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAlignment="center"
    android:textSize="12dp"
    android:textColor="@color/white"
    android:layout_marginTop="4dp"
    android:layout_gravity="center"
    android:paddingHorizontal="8dp"
    android:paddingVertical="2dp"
    android:background="@drawable/slot_type_bg"/>

然后在drawable目录下创建slot_type_bg.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="10dp"/>
    <solid android:color="@color/text_grey"/> <!-- 默认背景色,可在代码中动态修改 -->
</shape>

2. 更新数据模型

原来的时间槽数据只包含时间信息,现在需要新增时段类型字段,创建一个TimeSlot数据类:

public class TimeSlot {
    private String time;
    private String slotType; // 比如"高峰时段"、"平峰时段"、"优惠时段"等

    public TimeSlot(String time, String slotType) {
        this.time = time;
        this.slotType = slotType;
    }

    // Getter和Setter方法
    public String getTime() { return time; }
    public void setTime(String time) { this.time = time; }
    public String getSlotType() { return slotType; }
    public void setSlotType(String slotType) { this.slotType = slotType; }
}

3. 调整RecyclerView的Adapter

在Adapter中绑定新增的时段类型TextView,还可以根据时段类型动态调整样式(比如颜色):

public class TimeSlotAdapter extends RecyclerView.Adapter<TimeSlotAdapter.ViewHolder> {
    private List<TimeSlot> timeSlotList;

    public TimeSlotAdapter(List<TimeSlot> timeSlotList) {
        this.timeSlotList = timeSlotList;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.time_slot_layout, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        TimeSlot slot = timeSlotList.get(position);
        // 绑定时间
        holder.timeSlotTv.setText(slot.getTime());
        // 绑定时段类型
        holder.slotTypeTv.setText(slot.getSlotType());

        // 可选:根据时段类型设置不同样式
        switch (slot.getSlotType()) {
            case "高峰时段":
                holder.slotTypeTv.setTextColor(Color.RED);
                holder.slotTypeTv.setBackgroundColor(Color.parseColor("#ffe5e5e5"));
                break;
            case "优惠时段":
                holder.slotTypeTv.setTextColor(Color.GREEN);
                holder.slotTypeTv.setBackgroundColor(Color.parseColor("#f0fff0"));
                break;
            default:
                holder.slotTypeTv.setTextColor(Color.GRAY);
                holder.slotTypeTv.setBackgroundColor(Color.parseColor("#f5f5f5"));
                break;
        }
    }

    @Override
    public int getItemCount() {
        return timeSlotList.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        TextView timeSlotTv;
        TextView slotTypeTv;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            timeSlotTv = itemView.findViewById(R.id.time_slot);
            slotTypeTv = itemView.findViewById(R.id.slot_type);
        }
    }
}

4. 更新数据填充逻辑

在你的activity_booking_calender对应的Activity/Fragment中,填充TimeSlot列表时,记得把时段类型数据也传入进去:

// 示例数据
List<TimeSlot> timeSlots = new ArrayList<>();
timeSlots.add(new TimeSlot("09:00 - 11:00", "平峰时段"));
timeSlots.add(new TimeSlot("11:00 - 13:00", "高峰时段"));
timeSlots.add(new TimeSlot("13:00 - 15:00", "优惠时段"));

// 设置Adapter
TimeSlotAdapter adapter = new TimeSlotAdapter(timeSlots);
recyclerView_timeSlots.setAdapter(adapter);

这样就完成了时段类型的显示功能,整个过程完全不需要引入任何第三方库,只用原生Android组件就能实现~

内容的提问来源于stack exchange,提问作者Karthick Jai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:15:36