From 7ca88424abd97ef67d0cb0a545a5ea3cc16c1ed4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=94=A1=E5=BB=BA=E5=AE=87?= <3209349497@qq.com> Date: Wed, 22 Oct 2025 19:31:58 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/adapter/ProductAdapter.java | 82 +++++++++ .../fragment/ItemDetailFragment.java | 89 +++++++++ .../src/main/java/manager/DataManager.java | 171 ++++++++++++++++++ .../main/res/layout/fragment_item_detail.xml | 142 +++++++++++++++ .../app/src/main/res/layout/item_product.xml | 76 ++++++++ 5 files changed, 560 insertions(+) create mode 100644 LLRiseTabBarDemo/app/src/main/java/adapter/ProductAdapter.java create mode 100644 LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/fragment/ItemDetailFragment.java create mode 100644 LLRiseTabBarDemo/app/src/main/java/manager/DataManager.java create mode 100644 LLRiseTabBarDemo/app/src/main/res/layout/fragment_item_detail.xml create mode 100644 LLRiseTabBarDemo/app/src/main/res/layout/item_product.xml diff --git a/LLRiseTabBarDemo/app/src/main/java/adapter/ProductAdapter.java b/LLRiseTabBarDemo/app/src/main/java/adapter/ProductAdapter.java new file mode 100644 index 0000000..e0cca9a --- /dev/null +++ b/LLRiseTabBarDemo/app/src/main/java/adapter/ProductAdapter.java @@ -0,0 +1,82 @@ +package com.startsmake.llrisetabbardemo.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.startsmake.llrisetabbardemo.R; +import com.startsmake.llrisetabbardemo.model.Item; + +import java.util.List; + +public class ProductAdapter extends RecyclerView.Adapter { + + private Context context; + private List itemList; + private OnItemClickListener listener; + + public interface OnItemClickListener { + void onItemClick(Item item); + } + + public ProductAdapter(Context context, List itemList, OnItemClickListener listener) { + this.context = context; + this.itemList = itemList; + this.listener = listener; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_product, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + Item item = itemList.get(position); + + holder.tvTitle.setText(item.getTitle()); + holder.tvPrice.setText(String.format("¥%.2f", item.getPrice())); + holder.tvLocation.setText(item.getLocation()); + + // 设置发布时间 + String time = android.text.format.DateFormat.format("MM-dd HH:mm", item.getPublishTime()).toString(); + holder.tvTime.setText(time); + + // 设置点击事件 + holder.itemView.setOnClickListener(v -> { + if (listener != null) { + listener.onItemClick(item); + } + }); + } + + @Override + public int getItemCount() { + return itemList.size(); + } + + public static class ViewHolder extends RecyclerView.ViewHolder { + ImageView ivImage; + TextView tvTitle; + TextView tvPrice; + TextView tvLocation; + TextView tvTime; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + ivImage = itemView.findViewById(R.id.ivProductImage); + tvTitle = itemView.findViewById(R.id.tvProductTitle); + tvPrice = itemView.findViewById(R.id.tvProductPrice); + tvLocation = itemView.findViewById(R.id.tvProductLocation); + tvTime = itemView.findViewById(R.id.tvProductTime); + } + } +} \ No newline at end of file diff --git a/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/fragment/ItemDetailFragment.java b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/fragment/ItemDetailFragment.java new file mode 100644 index 0000000..29aa3fd --- /dev/null +++ b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/fragment/ItemDetailFragment.java @@ -0,0 +1,89 @@ +package com.startsmake.llrisetabbardemo.fragment; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + +import com.bumptech.glide.Glide; +import com.startsmake.llrisetabbardemo.R; +import com.startsmake.llrisetabbardemo.model.Item; + +public class ItemDetailFragment extends Fragment { + + private static final String ARG_ITEM = "item"; + + private Item item; + + public static ItemDetailFragment newInstance(Item item) { + ItemDetailFragment fragment = new ItemDetailFragment(); + Bundle args = new Bundle(); + args.putSerializable(ARG_ITEM, item); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + item = (Item) getArguments().getSerializable(ARG_ITEM); + } + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_item_detail, container, false); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + if (item == null) { + Toast.makeText(getContext(), "商品信息加载失败", Toast.LENGTH_SHORT).show(); + return; + } + + // 初始化视图 + ImageView ivItemImage = view.findViewById(R.id.ivItemImage); + TextView tvTitle = view.findViewById(R.id.tvTitle); + TextView tvPrice = view.findViewById(R.id.tvPrice); + TextView tvDescription = view.findViewById(R.id.tvDescription); + TextView tvCategory = view.findViewById(R.id.tvCategory); + TextView tvLocation = view.findViewById(R.id.tvLocation); + TextView tvContact = view.findViewById(R.id.tvContact); + TextView tvPublishTime = view.findViewById(R.id.tvPublishTime); + + // 设置商品信息 + tvTitle.setText(item.getTitle()); + tvPrice.setText(String.format("¥%.2f", item.getPrice())); + tvDescription.setText(item.getDescription()); + tvCategory.setText("分类:" + item.getCategory()); + tvLocation.setText("位置:" + item.getLocation()); + tvContact.setText("联系方式:" + item.getContact()); + + // 设置发布时间 + String time = android.text.format.DateFormat.format("yyyy-MM-dd HH:mm", item.getPublishTime()).toString(); + tvPublishTime.setText("发布时间:" + time); + + // 加载图片(这里使用第一张图片作为主图) + if (item.getImageUrls() != null && !item.getImageUrls().isEmpty()) { + // 实际项目中这里应该加载网络图片,这里用占位符 + ivItemImage.setImageResource(R.mipmap.ic_launcher); + } + + // 联系卖家按钮 + view.findViewById(R.id.btnContact).setOnClickListener(v -> { + Toast.makeText(getContext(), "联系卖家:" + item.getContact(), Toast.LENGTH_SHORT).show(); + }); + } +} \ No newline at end of file diff --git a/LLRiseTabBarDemo/app/src/main/java/manager/DataManager.java b/LLRiseTabBarDemo/app/src/main/java/manager/DataManager.java new file mode 100644 index 0000000..42ab205 --- /dev/null +++ b/LLRiseTabBarDemo/app/src/main/java/manager/DataManager.java @@ -0,0 +1,171 @@ +package com.startsmake.llrisetabbardemo.manager; + +import com.startsmake.llrisetabbardemo.model.Item; + +import java.util.ArrayList; +import java.util.List; + +/** + * 数据管理类 - 使用单例模式管理商品数据 + * 负责商品的增删改查操作 + */ +public class DataManager { + + // 单例实例 + private static DataManager instance; + + // 商品列表 + private List itemList; + + // 私有构造函数,防止外部创建实例 + private DataManager() { + itemList = new ArrayList<>(); + // 初始化时添加一些示例数据 + initSampleData(); + } + + /** + * 获取单例实例 + * @return DataManager 实例 + */ + public static DataManager getInstance() { + if (instance == null) { + instance = new DataManager(); + } + return instance; + } + + /** + * 初始化示例数据 + */ + private void initSampleData() { + // 示例商品1 - 数码产品 + Item item1 = new Item(); + item1.setId("item_001"); + item1.setTitle("全新iPhone 13 Pro"); + item1.setDescription("全新未拆封,256GB,远峰蓝色,国行正品,带发票"); + item1.setPrice(6999.00); + item1.setCategory("数码产品"); + item1.setLocation("北京"); + item1.setContact("138****1234"); + item1.setPublishTime(System.currentTimeMillis() - 2 * 60 * 60 * 1000); // 2小时前发布 + itemList.add(item1); + + // 示例商品2 - 数码产品 + Item item2 = new Item(); + item2.setId("item_002"); + item2.setTitle("二手笔记本电脑"); + item2.setDescription("联想小新,i5处理器,8GB内存,256GB固态硬盘,95成新"); + item2.setPrice(2500.00); + item2.setCategory("数码产品"); + item2.setLocation("上海"); + item2.setContact("微信:abc123"); + item2.setPublishTime(System.currentTimeMillis() - 5 * 60 * 60 * 1000); // 5小时前发布 + itemList.add(item2); + + // 示例商品3 - 服装鞋帽 + Item item3 = new Item(); + item3.setId("item_003"); + item3.setTitle("品牌运动鞋"); + item3.setDescription("耐克运动鞋,42码,只穿过几次,几乎全新,原盒在"); + item3.setPrice(299.00); + item3.setCategory("服装鞋帽"); + item3.setLocation("广州"); + item3.setContact("159****5678"); + item3.setPublishTime(System.currentTimeMillis() - 24 * 60 * 60 * 1000); // 1天前发布 + itemList.add(item3); + + // 示例商品4 - 图书文具 + Item item4 = new Item(); + item4.setId("item_004"); + item4.setTitle("Java编程思想"); + item4.setDescription("Java编程思想第5版,几乎全新,无笔记无划痕"); + item4.setPrice(45.00); + item4.setCategory("图书文具"); + item4.setLocation("杭州"); + item4.setContactQQ("123456789"); + item4.setPublishTime(System.currentTimeMillis() - 3 * 24 * 60 * 60 * 1000); // 3天前发布 + itemList.add(item4); + } + + /** + * 获取所有商品列表 + * @return 商品列表 + */ + public List getAllItems() { + return itemList; + } + + /** + * 添加新商品(发布新商品时调用) + * @param item 商品对象 + */ + public void addItem(Item item) { + // 为新商品生成ID + item.setId("item_" + System.currentTimeMillis()); + // 设置发布时间 + item.setPublishTime(System.currentTimeMillis()); + // 将新商品添加到列表最前面(最新发布的显示在最前面) + itemList.add(0, item); + } + + /** + * 根据ID查找商品 + * @param id 商品ID + * @return 商品对象,找不到返回null + */ + public Item getItemById(String id) { + for (Item item : itemList) { + if (item.getId().equals(id)) { + return item; + } + } + return null; + } + + /** + * 根据分类筛选商品 + * @param category 分类名称 + * @return 该分类下的商品列表 + */ + public List getItemsByCategory(String category) { + List result = new ArrayList<>(); + for (Item item : itemList) { + if (item.getCategory().equals(category)) { + result.add(item); + } + } + return result; + } + + /** + * 根据关键词搜索商品 + * @param keyword 搜索关键词 + * @return 匹配的商品列表 + */ + public List searchItems(String keyword) { + List result = new ArrayList<>(); + for (Item item : itemList) { + if (item.getTitle().toLowerCase().contains(keyword.toLowerCase()) || + item.getDescription().toLowerCase().contains(keyword.toLowerCase())) { + result.add(item); + } + } + return result; + } + + /** + * 获取商品数量 + * @return 商品总数 + */ + public int getItemCount() { + return itemList.size(); + } + + /** + * 清空所有数据(主要用于测试) + */ + public void clearAll() { + itemList.clear(); + } +} \ No newline at end of file diff --git a/LLRiseTabBarDemo/app/src/main/res/layout/fragment_item_detail.xml b/LLRiseTabBarDemo/app/src/main/res/layout/fragment_item_detail.xml new file mode 100644 index 0000000..94dfa00 --- /dev/null +++ b/LLRiseTabBarDemo/app/src/main/res/layout/fragment_item_detail.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +