diff --git a/example/app/src/main/java/com/ruilaizi/example/AIServiceEntry.java b/example/app/src/main/java/com/ruilaizi/example/AIServiceEntry.java new file mode 100644 index 0000000..f1c3ddd --- /dev/null +++ b/example/app/src/main/java/com/ruilaizi/example/AIServiceEntry.java @@ -0,0 +1,21 @@ +package com.ruilaizi.example; + +import androidx.annotation.Nullable; + +/** + * AI 应用列表项:标题、副标题、标签、点击跳转的 Activity(null 表示占位或特殊处理)。 + */ +public class AIServiceEntry { + public final String title; + public final String subtitle; + public final String badge; + @Nullable + public final Class activityClass; + + public AIServiceEntry(String title, String subtitle, String badge, @Nullable Class activityClass) { + this.title = title; + this.subtitle = subtitle; + this.badge = badge; + this.activityClass = activityClass; + } +} diff --git a/example/app/src/main/java/com/ruilaizi/example/AIServicesActivity.java b/example/app/src/main/java/com/ruilaizi/example/AIServicesActivity.java index 1401942..c95ebc1 100644 --- a/example/app/src/main/java/com/ruilaizi/example/AIServicesActivity.java +++ b/example/app/src/main/java/com/ruilaizi/example/AIServicesActivity.java @@ -4,14 +4,10 @@ import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; import android.widget.LinearLayout; -import android.widget.TextView; -import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; -import com.ruilaizi.example.databinding.ActivityAiServicesBinding; import com.ruilaizi.example.databinding.ItemAiServiceBinding; import java.util.ArrayList; @@ -19,86 +15,68 @@ import java.util.List; /** * AI 智能应用列表:有参考实现的跳转对应页,无的跳转占位页。 + * 使用 ConstraintLayout + findViewById 确保列表区域有高度且容器正确。 */ public class AIServicesActivity extends AppCompatActivity { - private static final class Entry { - final String title; - final String subtitle; - final String badge; - @Nullable final Class activityClass; - final boolean placeholder; - - Entry(String title, String subtitle, String badge, @Nullable Class activityClass) { - this.title = title; - this.subtitle = subtitle; - this.badge = badge; - this.activityClass = activityClass; - this.placeholder = (activityClass == null); - } - } - - private final List entries = new ArrayList<>(); + private final List entries = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ActivityAiServicesBinding binding = ActivityAiServicesBinding.inflate(getLayoutInflater()); - setContentView(binding.getRoot()); + setContentView(R.layout.activity_ai_services); buildEntries(); - binding.btnBack.setOnClickListener(v -> finish()); - LinearLayout container = binding.containerAiList; + findViewById(R.id.btn_back).setOnClickListener(v -> finish()); + + LinearLayout container = findViewById(R.id.container_ai_list); LayoutInflater inflater = getLayoutInflater(); - for (int i = 0; i < entries.size(); i++) { - Entry e = entries.get(i); + for (AIServiceEntry e : entries) { ItemAiServiceBinding itemBinding = ItemAiServiceBinding.inflate(inflater, container, false); itemBinding.itemTitle.setText(e.title); itemBinding.itemSubtitle.setText(e.subtitle); itemBinding.itemBadge.setText(e.badge); itemBinding.itemBadge.setVisibility(View.VISIBLE); - final int index = i; - itemBinding.getRoot().setOnClickListener(v -> onItemClick(entries.get(index))); + itemBinding.getRoot().setOnClickListener(v -> onItemClick(e)); container.addView(itemBinding.getRoot()); } } private void buildEntries() { entries.clear(); - // 有参考实现的:跳转对应 Activity - entries.add(new Entry("智能饭菜规划", "AI智能推荐营养搭配,让每一餐都健康美味", "热门", MealPlanningActivity.class)); - entries.add(new Entry("提示词优化", "两阶段专家生成专业提示词", "通用", null)); // 主界面已有,可跳回主界面 - entries.add(new Entry("旅行攻略规划", "根据目的地与天数,AI 生成行程与实用建议", "出行", TravelPlanningActivity.class)); - entries.add(new Entry("智能周报生成", "输入工作要点,一键生成规范周报/日报", "办公", WeeklyReportActivity.class)); - entries.add(new Entry("会议纪要整理", "粘贴会议转写或要点,一键生成结构化会议纪要", "办公", MeetingMinutesActivity.class)); - // 以下为占位 - entries.add(new Entry("古诗词解析", "深度解析古诗词意境,感受中华文化之美", "文化", null)); - entries.add(new Entry("古诗词收藏", "收藏喜爱的古诗词,建立个人文化宝库", "收藏", null)); - entries.add(new Entry("简历/求职信优化", "润色简历或根据岗位生成针对性求职信", "求职", null)); - entries.add(new Entry("智能提示词优化2号专家", "需求分析 + 领域专家生成高质量提示词", "专家", null)); - entries.add(new Entry("智能提示词优化3号专家", "需求分析 + 领域专家生成,含历史记录", "专家", null)); - entries.add(new Entry("读书笔记/摘要", "生成摘要、金句、思维导图式大纲或读后感", "文化", null)); - entries.add(new Entry("育儿/教育助手", "育儿建议、睡前故事、简单科普或习题讲解", "教育", null)); - entries.add(new Entry("健身/运动计划", "根据目标与场地生成一周训练计划", "健康", null)); - entries.add(new Entry("合同/条款解读", "人话版要点、风险提示与建议关注条款", "法律", null)); - entries.add(new Entry("小红书/短视频脚本", "生成标题、分镜文案、口播稿", "创作", null)); - entries.add(new Entry("面试模拟/问答准备", "按岗位类型出题并给参考答案与点评", "求职", null)); - entries.add(new Entry("节日/祝福语生成", "祝福语、贺卡文案、红包配文", "生活", null)); - entries.add(new Entry("个人复盘/周复盘", "结构化复盘与下周重点", "成长", null)); - entries.add(new Entry("待办/日程整理", "零散待办生成按优先级与日期的日程清单", "效率", null)); - entries.add(new Entry("邮件润色/回复建议", "草稿或要点生成得体邮件回复", "办公", null)); - entries.add(new Entry("演讲稿/汇报稿", "根据主题与场合生成演讲稿或汇报大纲", "办公", null)); - entries.add(new Entry("取名/品牌名", "公司名、产品名或宝宝取名建议", "创意", null)); - entries.add(new Entry("菜谱/做法", "根据食材或菜名生成详细做法", "生活", null)); - entries.add(new Entry("学习计划/备考规划", "生成学习计划与复习建议", "教育", null)); + // 已实现:跳转对应 Activity + entries.add(new AIServiceEntry("智能饭菜规划", "AI智能推荐营养搭配,让每一餐都健康美味", "热门", MealPlanningActivity.class)); + entries.add(new AIServiceEntry("提示词优化", "两阶段专家生成专业提示词", "通用", null)); // 主界面已有,点击返回主界面 + entries.add(new AIServiceEntry("旅行攻略规划", "根据目的地与天数,AI 生成行程与实用建议", "出行", TravelPlanningActivity.class)); + entries.add(new AIServiceEntry("智能周报生成", "输入工作要点,一键生成规范周报/日报", "办公", WeeklyReportActivity.class)); + entries.add(new AIServiceEntry("会议纪要整理", "粘贴会议转写或要点,一键生成结构化会议纪要", "办公", MeetingMinutesActivity.class)); + // 占位:点击进入 PlaceholderActivity 显示「敬请期待」 + entries.add(new AIServiceEntry("古诗词解析", "深度解析古诗词意境,感受中华文化之美", "文化", null)); + entries.add(new AIServiceEntry("古诗词收藏", "收藏喜爱的古诗词,建立个人文化宝库", "收藏", null)); + entries.add(new AIServiceEntry("简历/求职信优化", "润色简历或根据岗位生成针对性求职信", "求职", null)); + entries.add(new AIServiceEntry("2号专家", "需求分析 + 领域专家生成高质量提示词", "专家", null)); + entries.add(new AIServiceEntry("3号专家", "需求分析 + 领域专家生成,含历史记录", "专家", null)); + entries.add(new AIServiceEntry("读书笔记", "生成摘要、金句、思维导图式大纲或读后感", "文化", null)); + entries.add(new AIServiceEntry("育儿助手", "育儿建议、睡前故事、简单科普或习题讲解", "教育", null)); + entries.add(new AIServiceEntry("健身计划", "根据目标与场地生成一周训练计划", "健康", null)); + entries.add(new AIServiceEntry("合同解读", "人话版要点、风险提示与建议关注条款", "法律", null)); + entries.add(new AIServiceEntry("小红书脚本", "生成标题、分镜文案、口播稿", "创作", null)); + entries.add(new AIServiceEntry("面试模拟", "按岗位类型出题并给参考答案与点评", "求职", null)); + entries.add(new AIServiceEntry("节日祝福", "祝福语、贺卡文案、红包配文", "生活", null)); + entries.add(new AIServiceEntry("复盘", "结构化复盘与下周重点", "成长", null)); + entries.add(new AIServiceEntry("待办", "零散待办生成按优先级与日期的日程清单", "效率", null)); + entries.add(new AIServiceEntry("邮件润色", "草稿或要点生成得体邮件回复", "办公", null)); + entries.add(new AIServiceEntry("演讲稿", "根据主题与场合生成演讲稿或汇报大纲", "办公", null)); + entries.add(new AIServiceEntry("取名", "公司名、产品名或宝宝取名建议", "创意", null)); + entries.add(new AIServiceEntry("菜谱", "根据食材或菜名生成详细做法", "生活", null)); + entries.add(new AIServiceEntry("学习计划", "生成学习计划与复习建议", "教育", null)); } - private void onItemClick(Entry e) { + private void onItemClick(AIServiceEntry e) { if (e.activityClass != null) { startActivity(new Intent(this, e.activityClass)); } else if ("提示词优化".equals(e.title)) { - // 主界面已有优化提示词,返回主界面 startActivity(new Intent(this, MainActivity.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); finish(); } else { diff --git a/example/app/src/main/java/com/ruilaizi/example/adapter/AIServiceAdapter.java b/example/app/src/main/java/com/ruilaizi/example/adapter/AIServiceAdapter.java new file mode 100644 index 0000000..f432f7b --- /dev/null +++ b/example/app/src/main/java/com/ruilaizi/example/adapter/AIServiceAdapter.java @@ -0,0 +1,75 @@ +package com.ruilaizi.example.adapter; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.ruilaizi.example.AIServiceEntry; +import com.ruilaizi.example.databinding.ItemAiServiceBinding; + +import java.util.ArrayList; +import java.util.List; + +/** + * AI 应用列表适配器,展示全部条目并支持点击。 + */ +public class AIServiceAdapter extends RecyclerView.Adapter { + + private final List list = new ArrayList<>(); + private OnItemClickListener onItemClickListener; + + public interface OnItemClickListener { + void onItemClick(AIServiceEntry entry); + } + + public void setOnItemClickListener(OnItemClickListener listener) { + this.onItemClickListener = listener; + } + + public void setEntries(List entries) { + list.clear(); + if (entries != null) { + list.addAll(entries); + } + notifyDataSetChanged(); + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + ItemAiServiceBinding binding = ItemAiServiceBinding.inflate( + LayoutInflater.from(parent.getContext()), parent, false); + return new ViewHolder(binding); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + AIServiceEntry e = list.get(position); + holder.binding.itemTitle.setText(e.title); + holder.binding.itemSubtitle.setText(e.subtitle); + holder.binding.itemBadge.setText(e.badge); + holder.binding.itemBadge.setVisibility(View.VISIBLE); + holder.itemView.setOnClickListener(v -> { + if (onItemClickListener != null) { + onItemClickListener.onItemClick(e); + } + }); + } + + @Override + public int getItemCount() { + return list.size(); + } + + static class ViewHolder extends RecyclerView.ViewHolder { + final ItemAiServiceBinding binding; + + ViewHolder(ItemAiServiceBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + } +} diff --git a/example/app/src/main/res/layout/activity_ai_services.xml b/example/app/src/main/res/layout/activity_ai_services.xml index df59d76..92557e1 100644 --- a/example/app/src/main/res/layout/activity_ai_services.xml +++ b/example/app/src/main/res/layout/activity_ai_services.xml @@ -1,17 +1,18 @@ - + android:padding="16dp" + app:layout_constraintTop_toTopOf="parent"> - + + android:textColor="@color/colorTextSecondary" + app:layout_constraintTop_toBottomOf="@id/header" /> + android:paddingBottom="24dp" + android:clipToPadding="false" + app:layout_constraintTop_toBottomOf="@id/subtitle" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent"> + android:orientation="vertical" + android:minHeight="200dp" /> - +