Compare commits

...

36 Commits

Author SHA1 Message Date
刘骐瑞 d86c0e6c70 25.10.23
2 months ago
刘骐瑞 5b3b5c1923 gai
2 months ago
刘骐瑞 be3945fb1e Merge remote-tracking branch 'remotes/origin/caijianyu_part'
2 months ago
刘骐瑞 fc2ab52293 ddd
2 months ago
刘骐瑞 8acf678eba add
2 months ago
刘骐瑞 0aa8412c57 add
2 months ago
刘骐瑞 a9de196957 add
2 months ago
刘骐瑞 ab66af1810 change
2 months ago
刘骐瑞 582e64efb4 aaa
2 months ago
刘骐瑞 d13982857f 3
2 months ago
刘骐瑞 26b6390c5d 合并用
2 months ago
px8tqwyol a1ecc77bbf Merge pull request '新版本' (#13) from wangze_part into master
2 months ago
wangze 659b971314 gai4
2 months ago
px8tqwyol 384eb58528 Merge pull request '新版本' (#12) from wangze_part into master
2 months ago
刘骐瑞 0210408f49 change
2 months ago
刘骐瑞 005589ac49 add
2 months ago
蔡建宇 f6563858e3 商品详情界面
2 months ago
wangze 33aa051fb3 gai3
2 months ago
px8tqwyol ed4abf927e Merge pull request '新版本' (#10) from niefangkai_part into master
2 months ago
聂方凯 d79fbbb4ea add
2 months ago
p5tyirj4z 9b3e8e0e54 Merge pull request 'gai2' (#9) from wangze_part into master
2 months ago
wangze 885d563780 gai2
2 months ago
px8tqwyol dfc96a769c Merge pull request '消息界面' (#8) from niefangkai_part into master
2 months ago
聂方凯 b925012b78 add
2 months ago
px8tqwyol 09c08ba9f3 Merge pull request 'new' (#7) from master into wangze_part
2 months ago
刘骐瑞 17e6b564ea change
2 months ago
刘骐瑞 e8244c0fad add
2 months ago
p5tyirj4z a69b944ab2 Merge pull request '我要' (#6) from master into wangze_part
2 months ago
wangze 5c48c5d87e gai
2 months ago
聂方凯 70024a0ce4 add
2 months ago
p7986wnly 5d8ed8b1e3 Merge pull request '发布界面' (#5) from caijianyu_part into master
2 months ago
蔡建宇 a67ea7cfee 2025.10.16
2 months ago
px8tqwyol 94548cb17d Merge pull request '新版本' (#3) from master into niefangkai_part
2 months ago
px8tqwyol 9f74135f2d Merge pull request '新版本' (#4) from master into wangze_part
2 months ago
px8tqwyol f9857ad318 Merge pull request '新版本' (#1) from master into caijianyu_part
2 months ago
刘骐瑞 aa1935e759 实现了登陆界面
2 months ago

@ -0,0 +1,3 @@
# 默认忽略的文件
/shelf/
/workspace.xml

@ -4,7 +4,7 @@
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2025-10-11T11:49:33.560456900Z">
<DropdownSelection timestamp="2025-10-22T14:13:58.701426800Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="LocalEmulator" identifier="path=C:\Users\asus\.android\avd\Pixel.avd" />

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="NullableNotNullManager">
@ -182,6 +183,13 @@
<component name="ProjectType">
<option name="id" value="Android" />
</component>
<component name="VisualizationToolProject">
<option name="state">
<ProjectState>
<option name="scale" value="1.0" />
</ProjectState>
</option>
</component>
<component name="masterDetails">
<states>
<state key="ProjectJDKs.UI">

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/LLRiseTabBarDemo.iml" filepath="$PROJECT_DIR$/.idea/LLRiseTabBarDemo.iml" />
</modules>
</component>
</project>

@ -1,6 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
<mapping directory="" vcs="Git" />
</component>
<component name="VcsProjectSettings">
<option name="detectVcsMappingsAutomatically" value="false" />
</component>
</project>

@ -1,28 +1,68 @@
apply plugin: 'com.android.application'
// app/build.gradle
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android' // Kotlin
}
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
namespace "com.startsmake.llrisetabbardemo"
compileSdk 33
defaultConfig {
applicationId "com.startsmake.llrisetabbardemo"
minSdkVersion 14
targetSdkVersion 23
minSdk 21
targetSdk 33
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
namespace "com.startsmake.llrisetabbardemo"
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
testImplementation 'junit:junit:4.12'
implementation 'com.android.support:appcompat-v7:23.1.0'
testImplementation 'junit:junit:4.13.2'
implementation 'com.github.bumptech.glide:glide:4.15.1'
implementation 'com.google.android.material:material:1.9.0'
implementation 'androidx.recyclerview:recyclerview:1.3.2'
// AndroidX
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.9.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
// Kotlin
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.8.20"
implementation 'com.google.android.flexbox:flexbox:3.0.0'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
//gson
implementation 'com.google.code.gson:gson:2.10.1'
//
implementation project(':mainnavigatetabbar')
}
//
configurations {
all {
exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk7'
exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8'
}
}
}

@ -1,5 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.startsmake.llrisetabbardemo">
<!-- 添加相机权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<application
android:allowBackup="true"
@ -7,13 +14,58 @@
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".activity.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<!-- 登录页面作为启动页 -->
<activity
android:name=".activity.LoginActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 主页面 -->
<activity
android:name=".activity.MainActivity"
android:exported="false" />
<!-- 注册页面 -->
<activity
android:name=".activity.RegisterActivity"
android:exported="false" />
<!-- 忘记密码页面 -->
<activity
android:name=".activity.ForgotPasswordActivity"
android:exported="false" />
<!-- 聊天页面 -->
<activity
android:name=".activity.ChatActivity"
android:exported="false" />
<!-- 搜索页面 -->
<activity
android:name=".activity.SearchActivity"
android:exported="false" />
<!-- 搜索结果页面 -->
<activity
android:name=".activity.SearchResultsActivity"
android:exported="false" />
<!-- 添加FileProvider支持用于摄像头功能 -->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
</manifest>
</manifest>

@ -0,0 +1,84 @@
package com.startsmake.llrisetabbardemo.adapter;
import android.content.Context;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.startsmake.llrisetabbardemo.R;
import java.util.List;
public class ImageAdapter extends BaseAdapter {
private Context context;
private List<Uri> imageUris;
private static final int MAX_IMAGES = 9;
public ImageAdapter(Context context, List<Uri> imageUris) {
this.context = context;
this.imageUris = imageUris;
}
@Override
public int getCount() {
return Math.min(imageUris.size() + 1, MAX_IMAGES);
}
@Override
public Object getItem(int position) {
if (position < imageUris.size()) {
return imageUris.get(position);
}
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item_image, parent, false);
holder = new ViewHolder();
holder.imageView = convertView.findViewById(R.id.imageView);
holder.deleteButton = convertView.findViewById(R.id.btnDelete);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (position < imageUris.size()) {
// 显示已选择的图片
Uri imageUri = imageUris.get(position);
Glide.with(context)
.load(imageUri)
.placeholder(android.R.drawable.ic_menu_gallery) // 使用系统图标作为占位符
.into(holder.imageView);
holder.deleteButton.setVisibility(View.VISIBLE);
holder.deleteButton.setOnClickListener(v -> {
imageUris.remove(position);
notifyDataSetChanged();
});
} else {
// 显示添加按钮
holder.imageView.setImageResource(android.R.drawable.ic_input_add); // 使用系统图标
holder.deleteButton.setVisibility(View.GONE);
}
return convertView;
}
static class ViewHolder {
ImageView imageView;
ImageView deleteButton;
}
}

@ -0,0 +1,76 @@
package adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
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<ProductAdapter.ViewHolder> {
private Context context;
private List<Item> itemList;
private OnItemClickListener listener;
public interface OnItemClickListener {
void onItemClick(Item item);
}
public ProductAdapter(Context context, List<Item> 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.tvDescription.setText(item.getDescription());
holder.tvPrice.setText(String.format("¥%.2f", item.getPrice()));
holder.tvCategory.setText(item.getCategory());
// 设置点击事件
holder.itemView.setOnClickListener(v -> {
if (listener != null) {
listener.onItemClick(item);
}
});
}
@Override
public int getItemCount() {
return itemList.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
TextView tvTitle;
TextView tvDescription;
TextView tvCategory;
TextView tvPrice;
public ViewHolder(@NonNull View itemView) {
super(itemView);
tvTitle = itemView.findViewById(R.id.product_name);
tvDescription = itemView.findViewById(R.id.product_description);
tvCategory = itemView.findViewById(R.id.product_category);
tvPrice = itemView.findViewById(R.id.product_price);
}
}
}

@ -0,0 +1,142 @@
package com.startsmake.llrisetabbardemo.activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.startsmake.llrisetabbardemo.R;
import com.startsmake.llrisetabbardemo.adapter.ChatMessageAdapter;
import com.startsmake.llrisetabbardemo.model.ChatMessage;
import java.util.ArrayList;
import java.util.List;
public class ChatActivity extends AppCompatActivity {
private TextView tvTitle;
private ImageView ivBack;
private RecyclerView rvChatMessages;
private EditText etMessage;
private ImageButton btnSend;
private ChatMessageAdapter chatAdapter;
private List<ChatMessage> messageList;
private String chatTitle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
// 获取传递过来的聊天标题
chatTitle = getIntent().getStringExtra("chat_title");
if (chatTitle == null) {
chatTitle = "聊天";
}
initView();
initData();
setupClickListeners();
}
private void initView() {
tvTitle = findViewById(R.id.tvTitle);
ivBack = findViewById(R.id.ivBack);
rvChatMessages = findViewById(R.id.rvChatMessages);
etMessage = findViewById(R.id.etMessage);
btnSend = findViewById(R.id.btnSend);
tvTitle.setText(chatTitle);
}
private void initData() {
messageList = new ArrayList<>();
// 添加一些初始消息
if ("通知消息".equals(chatTitle)) {
messageList.add(new ChatMessage("系统", "红包到账提醒", "10:30", false));
messageList.add(new ChatMessage("我", "收到了,谢谢!", "10:31", true));
} else if ("刑事组之虎".equals(chatTitle)) {
messageList.add(new ChatMessage("刑事组之虎", "快给ta一个评价吧", "04-19 14:20", false));
messageList.add(new ChatMessage("我", "已经评价了,商品很不错!", "04-19 14:25", true));
} else {
messageList.add(new ChatMessage(chatTitle, "你好!", "刚刚", false));
}
chatAdapter = new ChatMessageAdapter(this, messageList);
rvChatMessages.setLayoutManager(new LinearLayoutManager(this));
rvChatMessages.setAdapter(chatAdapter);
// 滚动到底部
rvChatMessages.scrollToPosition(messageList.size() - 1);
}
private void setupClickListeners() {
// 返回按钮
ivBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
// 发送按钮
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendMessage();
}
});
}
private void sendMessage() {
String message = etMessage.getText().toString().trim();
if (!TextUtils.isEmpty(message)) {
// 添加新消息到列表
ChatMessage newMessage = new ChatMessage("我", message, "刚刚", true);
messageList.add(newMessage);
chatAdapter.notifyItemInserted(messageList.size() - 1);
// 清空输入框
etMessage.setText("");
// 滚动到底部
rvChatMessages.scrollToPosition(messageList.size() - 1);
// 模拟对方回复(可选)
simulateReply(message);
}
}
private void simulateReply(String userMessage) {
// 延迟模拟回复
rvChatMessages.postDelayed(new Runnable() {
@Override
public void run() {
String reply = generateReply(userMessage);
ChatMessage replyMessage = new ChatMessage(chatTitle, reply, "刚刚", false);
messageList.add(replyMessage);
chatAdapter.notifyItemInserted(messageList.size() - 1);
rvChatMessages.scrollToPosition(messageList.size() - 1);
}
}, 1000);
}
private String generateReply(String userMessage) {
// 简单的回复逻辑
if (userMessage.contains("你好") || userMessage.contains("在吗")) {
return "在的,有什么可以帮您?";
} else if (userMessage.contains("价格") || userMessage.contains("多少钱")) {
return "这个商品价格是xxx元";
} else if (userMessage.contains("谢谢")) {
return "不客气!";
} else {
return "收到您的消息了!";
}
}
}

@ -0,0 +1,293 @@
package com.startsmake.llrisetabbardemo.activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.material.textfield.TextInputEditText;
import com.startsmake.llrisetabbardemo.R;
import com.startsmake.llrisetabbardemo.manager.UserManager;
import java.util.Random;
public class ForgotPasswordActivity extends AppCompatActivity {
private TextInputEditText etPhone, etVerificationCode, etNewPassword;
private Button btnSendCode, btnResetPassword;
private ImageButton btnBack;
private TextView tvLogin;
private CountDownTimer countDownTimer;
private boolean isCounting = false;
private String verificationCode = "";
private UserManager userManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_forgot_password);
userManager = UserManager.getInstance(this);
initViews();
setupClickListeners();
}
private void initViews() {
etPhone = findViewById(R.id.et_phone);
etVerificationCode = findViewById(R.id.et_verification_code);
etNewPassword = findViewById(R.id.et_new_password);
btnSendCode = findViewById(R.id.btn_send_code);
btnResetPassword = findViewById(R.id.btn_reset_password);
btnBack = findViewById(R.id.btn_back);
tvLogin = findViewById(R.id.tv_login);
}
private void setupClickListeners() {
// 返回按钮
btnBack.setOnClickListener(v -> finish());
// 发送验证码
btnSendCode.setOnClickListener(v -> sendVerificationCode());
// 重置密码按钮
btnResetPassword.setOnClickListener(v -> attemptResetPassword());
// 返回登录
tvLogin.setOnClickListener(v -> {
Intent intent = new Intent(ForgotPasswordActivity.this, LoginActivity.class);
startActivity(intent);
finish();
});
}
private void sendVerificationCode() {
String phone = etPhone.getText().toString().trim();
if (!validatePhone(phone)) {
return;
}
// 检查用户是否存在
if (!userManager.isPhoneRegistered(phone)) {
etPhone.setError("该手机号未注册");
etPhone.requestFocus();
Toast.makeText(this, "该手机号未注册,请先注册", Toast.LENGTH_SHORT).show();
return;
}
if (!isCounting) {
// 生成随机验证码
verificationCode = generateVerificationCode();
startCountDown();
// 模拟发送验证码(在实际应用中应该通过短信发送)
Toast.makeText(this, "验证码已发送: " + verificationCode, Toast.LENGTH_LONG).show();
}
}
private boolean validatePhone(String phone) {
if (phone.isEmpty()) {
etPhone.setError("请输入手机号");
etPhone.requestFocus();
return false;
}
if (phone.length() != 11) {
etPhone.setError("手机号格式不正确");
etPhone.requestFocus();
return false;
}
if (!phone.startsWith("1")) {
etPhone.setError("手机号格式不正确");
etPhone.requestFocus();
return false;
}
return true;
}
private String generateVerificationCode() {
Random random = new Random();
int code = 100000 + random.nextInt(900000);
return String.valueOf(code);
}
private void startCountDown() {
isCounting = true;
btnSendCode.setEnabled(false);
countDownTimer = new CountDownTimer(60000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
btnSendCode.setText(millisUntilFinished / 1000 + "秒后重发");
}
@Override
public void onFinish() {
isCounting = false;
btnSendCode.setEnabled(true);
btnSendCode.setText("发送验证码");
// 验证码过期
verificationCode = "";
}
}.start();
}
private void attemptResetPassword() {
String phone = etPhone.getText().toString().trim();
String code = etVerificationCode.getText().toString().trim();
String newPassword = etNewPassword.getText().toString().trim();
if (!validateResetInput(phone, code, newPassword)) {
return;
}
// 验证验证码
if (!code.equals(verificationCode)) {
etVerificationCode.setError("验证码错误");
etVerificationCode.requestFocus();
Toast.makeText(this, "请输入正确的验证码", Toast.LENGTH_SHORT).show();
return;
}
// 检查验证码是否过期
if (verificationCode.isEmpty()) {
etVerificationCode.setError("验证码已过期,请重新获取");
etVerificationCode.requestFocus();
Toast.makeText(this, "验证码已过期,请重新获取", Toast.LENGTH_SHORT).show();
return;
}
// 重置密码
boolean success = userManager.resetPassword(phone, newPassword);
if (success) {
performResetSuccess(phone);
} else {
Toast.makeText(this, "重置密码失败,请检查手机号是否正确", Toast.LENGTH_SHORT).show();
etPhone.setError("手机号未注册或不存在");
etPhone.requestFocus();
}
}
private boolean validateResetInput(String phone, String code, String newPassword) {
// 验证手机号
if (phone.isEmpty()) {
etPhone.setError("请输入手机号");
etPhone.requestFocus();
return false;
}
if (phone.length() != 11) {
etPhone.setError("手机号格式不正确");
etPhone.requestFocus();
return false;
}
if (!phone.startsWith("1")) {
etPhone.setError("手机号格式不正确");
etPhone.requestFocus();
return false;
}
// 验证验证码
if (code.isEmpty()) {
etVerificationCode.setError("请输入验证码");
etVerificationCode.requestFocus();
return false;
}
if (code.length() != 6) {
etVerificationCode.setError("验证码格式不正确");
etVerificationCode.requestFocus();
return false;
}
// 验证新密码
if (newPassword.isEmpty()) {
etNewPassword.setError("请输入新密码");
etNewPassword.requestFocus();
return false;
}
if (newPassword.length() < 6) {
etNewPassword.setError("密码至少6位");
etNewPassword.requestFocus();
return false;
}
if (newPassword.length() > 20) {
etNewPassword.setError("密码最多20位");
etNewPassword.requestFocus();
return false;
}
// 检查密码强度(可选增强)
if (!isPasswordStrong(newPassword)) {
etNewPassword.setError("密码过于简单,建议包含字母和数字");
etNewPassword.requestFocus();
return false;
}
return true;
}
private boolean isPasswordStrong(String password) {
// 简单的密码强度检查:至少包含字母和数字
boolean hasLetter = false;
boolean hasDigit = false;
for (char c : password.toCharArray()) {
if (Character.isLetter(c)) {
hasLetter = true;
} else if (Character.isDigit(c)) {
hasDigit = true;
}
// 如果已经满足条件,提前返回
if (hasLetter && hasDigit) {
return true;
}
}
return hasLetter && hasDigit;
}
private void performResetSuccess(String phone) {
Toast.makeText(this, "密码重置成功!", Toast.LENGTH_SHORT).show();
// 重置成功后跳转到登录页面,并传递手机号方便用户登录
Intent intent = new Intent(ForgotPasswordActivity.this, LoginActivity.class);
intent.putExtra("phone", phone);
intent.putExtra("from_forgot_password", true);
startActivity(intent);
finish();
}
@Override
protected void onResume() {
super.onResume();
// 如果从Intent中获取到手机号自动填充
Intent intent = getIntent();
if (intent != null && intent.hasExtra("phone")) {
String phone = intent.getStringExtra("phone");
if (phone != null && !phone.isEmpty()) {
etPhone.setText(phone);
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (countDownTimer != null) {
countDownTimer.cancel();
}
}
}

@ -0,0 +1,179 @@
package com.startsmake.llrisetabbardemo.activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.material.textfield.TextInputEditText;
import com.startsmake.llrisetabbardemo.R;
import com.startsmake.llrisetabbardemo.manager.UserManager;
import com.startsmake.llrisetabbardemo.model.User;
public class LoginActivity extends AppCompatActivity {
private TextInputEditText etPhone, etPassword;
private Button btnLogin, btnSkipLogin;
private TextView tvForgotPassword, tvRegister;
private UserManager userManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
// 初始化用户管理器
userManager = UserManager.getInstance(this);
// 移除自动登录检查,让用户手动登录
// if (userManager.isLoggedIn()) {
// navigateToMain();
// return;
// }
initViews();
setupClickListeners();
// 检查是否有从其他页面传递过来的手机号
handleIntentData();
}
private void initViews() {
etPhone = findViewById(R.id.et_phone);
etPassword = findViewById(R.id.et_password);
btnLogin = findViewById(R.id.btn_login);
btnSkipLogin = findViewById(R.id.btn_skip_login);
tvForgotPassword = findViewById(R.id.tv_forgot_password);
tvRegister = findViewById(R.id.tv_register);
}
private void setupClickListeners() {
// 登录按钮
btnLogin.setOnClickListener(v -> attemptLogin());
// 跳过登录按钮
btnSkipLogin.setOnClickListener(v -> skipToMain());
// 忘记密码
tvForgotPassword.setOnClickListener(v -> {
Intent intent = new Intent(LoginActivity.this, ForgotPasswordActivity.class);
startActivity(intent);
});
// 注册
tvRegister.setOnClickListener(v -> {
Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
startActivity(intent);
});
}
private void handleIntentData() {
Intent intent = getIntent();
if (intent != null && intent.hasExtra("phone")) {
String phone = intent.getStringExtra("phone");
if (phone != null && !phone.isEmpty()) {
etPhone.setText(phone);
// 自动聚焦到密码输入框
etPassword.requestFocus();
}
}
}
private void attemptLogin() {
String phone = etPhone.getText().toString().trim();
String password = etPassword.getText().toString().trim();
if (!validateInput(phone, password)) {
return;
}
// 使用 UserManager 进行登录验证
User user = userManager.loginUser(phone, password);
if (user != null) {
// 登录成功
performLoginSuccess(user);
} else {
// 登录失败
showLoginError();
}
}
private boolean validateInput(String phone, String password) {
if (phone.isEmpty()) {
etPhone.setError("请输入手机号");
etPhone.requestFocus();
return false;
}
if (password.isEmpty()) {
etPassword.setError("请输入密码");
etPassword.requestFocus();
return false;
}
if (phone.length() != 11) {
etPhone.setError("手机号格式不正确");
etPhone.requestFocus();
return false;
}
if (!phone.startsWith("1")) {
etPhone.setError("手机号格式不正确");
etPhone.requestFocus();
return false;
}
if (password.length() < 6) {
etPassword.setError("密码至少6位");
etPassword.requestFocus();
return false;
}
return true;
}
private void performLoginSuccess(User user) {
// 保存登录状态和用户信息
saveLoginState(user);
Toast.makeText(this, "登录成功!", Toast.LENGTH_SHORT).show();
navigateToMain();
}
private void saveLoginState(User user) {
SharedPreferences sp = getSharedPreferences("user_info", MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putBoolean("is_logged_in", true);
editor.putString("user_phone", user.getPhone());
editor.putString("user_name", user.getUsername());
editor.putString("user_token", "mock_token_" + System.currentTimeMillis());
editor.apply();
}
private void showLoginError() {
Toast.makeText(this, "手机号或密码错误", Toast.LENGTH_SHORT).show();
etPassword.setError("密码错误");
etPassword.requestFocus();
}
private void skipToMain() {
Toast.makeText(this, "游客模式进入", Toast.LENGTH_SHORT).show();
navigateToMain();
}
private void navigateToMain() {
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
@Override
protected void onDestroy() {
super.onDestroy();
// 清理资源
}
}

@ -1,26 +1,31 @@
package com.startsmake.llrisetabbardemo.activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import com.startsmake.llrisetabbardemo.R;
import com.startsmake.llrisetabbardemo.fragment.CityFragment;
import com.startsmake.llrisetabbardemo.fragment.HomeFragment;
import com.startsmake.llrisetabbardemo.fragment.MessageFragment;
import com.startsmake.llrisetabbardemo.fragment.PersonFragment;
import com.startsmake.llrisetabbardemo.fragment.PublishFragment;
import com.startsmake.mainnavigatetabbar.widget.MainNavigateTabBar;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private static final String TAG_PAGE_HOME = "首页";
private static final String TAG_PAGE_CITY = "同城";
private static final String TAG_PAGE_CITY = "集市";
private static final String TAG_PAGE_PUBLISH = "发布";
private static final String TAG_PAGE_MESSAGE = "消息";
private static final String TAG_PAGE_PERSON = "我的";
private MainNavigateTabBar mNavigateTabBar;
@Override
@ -28,26 +33,189 @@ public class MainActivity extends AppCompatActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNavigateTabBar = (MainNavigateTabBar) findViewById(R.id.mainTabBar);
// 初始化视图,传递 savedInstanceState
initViews(savedInstanceState);
mNavigateTabBar.onRestoreInstanceState(savedInstanceState);
mNavigateTabBar.addTab(HomeFragment.class, new MainNavigateTabBar.TabParam(R.mipmap.comui_tab_home, R.mipmap.comui_tab_home_selected, TAG_PAGE_HOME));
mNavigateTabBar.addTab(CityFragment.class, new MainNavigateTabBar.TabParam(R.mipmap.comui_tab_city, R.mipmap.comui_tab_city_selected, TAG_PAGE_CITY));
mNavigateTabBar.addTab(null, new MainNavigateTabBar.TabParam(0, 0, TAG_PAGE_PUBLISH));
mNavigateTabBar.addTab(MessageFragment.class, new MainNavigateTabBar.TabParam(R.mipmap.comui_tab_message, R.mipmap.comui_tab_message_selected, TAG_PAGE_MESSAGE));
mNavigateTabBar.addTab(PersonFragment.class, new MainNavigateTabBar.TabParam(R.mipmap.comui_tab_person, R.mipmap.comui_tab_person_selected, TAG_PAGE_PERSON));
// 检查登录状态(可选)
checkLoginStatus();
}
private void initViews(Bundle savedInstanceState) {
try {
mNavigateTabBar = findViewById(R.id.mainTabBar);
if (mNavigateTabBar == null) {
Toast.makeText(this, "底部导航栏初始化失败", Toast.LENGTH_SHORT).show();
return;
}
mNavigateTabBar.onRestoreInstanceState(savedInstanceState);
// 添加Tab
mNavigateTabBar.addTab(HomeFragment.class, new MainNavigateTabBar.TabParam(R.mipmap.comui_tab_home, R.mipmap.comui_tab_home_selected, TAG_PAGE_HOME));
mNavigateTabBar.addTab(CityFragment.class, new MainNavigateTabBar.TabParam(R.mipmap.comui_tab_city, R.mipmap.comui_tab_city_selected, TAG_PAGE_CITY));
mNavigateTabBar.addTab(null, new MainNavigateTabBar.TabParam(R.mipmap.comui_tab_post, R.mipmap.comui_tab_post, TAG_PAGE_PUBLISH)); // 发布按钮
mNavigateTabBar.addTab(MessageFragment.class, new MainNavigateTabBar.TabParam(R.mipmap.comui_tab_message, R.mipmap.comui_tab_message_selected, TAG_PAGE_MESSAGE));
mNavigateTabBar.addTab(PersonFragment.class, new MainNavigateTabBar.TabParam(R.mipmap.comui_tab_person, R.mipmap.comui_tab_person_selected, TAG_PAGE_PERSON));
} catch (Exception e) {
Toast.makeText(this, "界面初始化失败", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mNavigateTabBar.onSaveInstanceState(outState);
if (mNavigateTabBar != null) {
mNavigateTabBar.onSaveInstanceState(outState);
}
}
private void checkLoginStatus() {
// 这里可以根据需要决定是否强制登录
// 如果应用要求必须登录,可以在这里跳转到登录页面
/*
SharedPreferences sp = getSharedPreferences("user_info", MODE_PRIVATE);
if (!sp.getBoolean("is_logged_in", false)) {
Intent intent = new Intent(this, LoginActivity.class);
startActivity(intent);
finish();
}
*/
}
// 发布按钮点击事件
public void onClickPublish(View v) {
Toast.makeText(this, "发布", Toast.LENGTH_LONG).show();
// 切换到发布Fragment
switchToPublishFragment();
}
// 切换到发布Fragment
public void switchToPublishFragment() {
try {
PublishFragment publishFragment = new PublishFragment();
// 使用FragmentTransaction来显示发布页面
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
// 替换当前显示的Fragment
transaction.replace(R.id.main_container, publishFragment, "PublishFragment");
transaction.addToBackStack("publish"); // 允许用户按返回键回到之前的Fragment
transaction.commit();
} catch (Exception e) {
Toast.makeText(this, "打开发布页面失败", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
// 切换回首页Fragment
public void switchToHomeFragment() {
try {
// 返回到首页
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStackImmediate();
} else {
// 如果后退栈为空,直接切换到首页
HomeFragment homeFragment = new HomeFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.main_container, homeFragment, TAG_PAGE_HOME);
transaction.commit();
}
// 确保底部导航栏选中首页
if (mNavigateTabBar != null) {
mNavigateTabBar.setCurrentSelectedTab(0); // 0 是首页的索引
}
} catch (Exception e) {
Toast.makeText(this, "返回首页失败", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
// 获取HomeFragment实例的方法
public HomeFragment getHomeFragment() {
try {
// 方法1通过Tag查找
Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_PAGE_HOME);
if (fragment instanceof HomeFragment) {
return (HomeFragment) fragment;
}
// 方法2遍历所有Fragment找到HomeFragment实例
List<Fragment> fragments = getSupportFragmentManager().getFragments();
if (fragments != null) {
for (Fragment fragmentItem : fragments) {
if (fragmentItem instanceof HomeFragment && fragmentItem.isVisible()) {
return (HomeFragment) fragmentItem;
}
}
}
// 方法3查找当前显示的Fragment
Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.main_container);
if (currentFragment instanceof HomeFragment) {
return (HomeFragment) currentFragment;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public void onBackPressed() {
// 处理返回键
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
// 如果有Fragment在后退栈中先弹出
getSupportFragmentManager().popBackStack();
// 确保底部导航栏状态正确
if (mNavigateTabBar != null) {
mNavigateTabBar.setCurrentSelectedTab(0); // 回到首页
}
} else {
// 双击退出应用
if (isTaskRoot()) {
// 如果是应用的根Activity可以实现双击退出
if (doubleBackToExitPressedOnce) {
super.onBackPressed();
return;
}
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, "再按一次退出应用", Toast.LENGTH_SHORT).show();
handler.postDelayed(() -> doubleBackToExitPressedOnce = false, 2000);
} else {
super.onBackPressed();
}
}
}
// 双击退出相关变量
private boolean doubleBackToExitPressedOnce = false;
private android.os.Handler handler = new android.os.Handler();
@Override
protected void onDestroy() {
super.onDestroy();
// 清理Handler防止内存泄漏
handler.removeCallbacksAndMessages(null);
}
// 切换到指定Tab的方法 - 简化版本
public void switchToTab(int tabIndex) {
if (mNavigateTabBar != null && tabIndex >= 0 && tabIndex <= 4) { // 假设有5个tab
mNavigateTabBar.setCurrentSelectedTab(tabIndex);
}
}
// 显示Toast的便捷方法
public void showToast(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
}
}

@ -0,0 +1,260 @@
package com.startsmake.llrisetabbardemo.activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.material.textfield.TextInputEditText;
import com.startsmake.llrisetabbardemo.R;
import com.startsmake.llrisetabbardemo.manager.UserManager;
import com.startsmake.llrisetabbardemo.model.User;
import java.util.Random;
public class RegisterActivity extends AppCompatActivity {
private TextInputEditText etPhone, etVerificationCode, etPassword;
private Button btnSendCode, btnRegister;
private ImageButton btnBack;
private TextView tvLogin;
private CountDownTimer countDownTimer;
private boolean isCounting = false;
private String verificationCode = "";
private UserManager userManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
userManager = UserManager.getInstance(this);
initViews();
setupClickListeners();
}
private void initViews() {
etPhone = findViewById(R.id.et_phone);
etVerificationCode = findViewById(R.id.et_verification_code);
etPassword = findViewById(R.id.et_password);
btnSendCode = findViewById(R.id.btn_send_code);
btnRegister = findViewById(R.id.btn_register);
btnBack = findViewById(R.id.btn_back);
tvLogin = findViewById(R.id.tv_login);
}
private void setupClickListeners() {
// 返回按钮
btnBack.setOnClickListener(v -> finish());
// 发送验证码
btnSendCode.setOnClickListener(v -> sendVerificationCode());
// 注册按钮
btnRegister.setOnClickListener(v -> attemptRegister());
// 立即登录
tvLogin.setOnClickListener(v -> {
Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
startActivity(intent);
finish();
});
}
private void sendVerificationCode() {
String phone = etPhone.getText().toString().trim();
if (!validatePhone(phone)) {
return;
}
// 检查用户是否已存在
if (userManager.isPhoneRegistered(phone)) {
etPhone.setError("该手机号已注册");
etPhone.requestFocus();
return;
}
if (!isCounting) {
// 生成随机验证码
verificationCode = generateVerificationCode();
startCountDown();
// 模拟发送验证码(在实际应用中应该通过短信发送)
Toast.makeText(this, "验证码已发送: " + verificationCode, Toast.LENGTH_LONG).show();
}
}
private boolean validatePhone(String phone) {
if (phone.isEmpty()) {
etPhone.setError("请输入手机号");
etPhone.requestFocus();
return false;
}
if (phone.length() != 11) {
etPhone.setError("手机号格式不正确");
etPhone.requestFocus();
return false;
}
if (!phone.startsWith("1")) {
etPhone.setError("手机号格式不正确");
etPhone.requestFocus();
return false;
}
return true;
}
private String generateVerificationCode() {
Random random = new Random();
int code = 100000 + random.nextInt(900000);
return String.valueOf(code);
}
private void startCountDown() {
isCounting = true;
btnSendCode.setEnabled(false);
countDownTimer = new CountDownTimer(60000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
btnSendCode.setText(millisUntilFinished / 1000 + "秒后重发");
}
@Override
public void onFinish() {
isCounting = false;
btnSendCode.setEnabled(true);
btnSendCode.setText("发送验证码");
// 验证码过期
verificationCode = "";
}
}.start();
}
private void attemptRegister() {
String phone = etPhone.getText().toString().trim();
String code = etVerificationCode.getText().toString().trim();
String password = etPassword.getText().toString().trim();
if (!validateRegisterInput(phone, code, password)) {
return;
}
// 验证验证码
if (!code.equals(verificationCode)) {
etVerificationCode.setError("验证码错误");
etVerificationCode.requestFocus();
Toast.makeText(this, "请输入正确的验证码", Toast.LENGTH_SHORT).show();
return;
}
// 检查验证码是否过期
if (verificationCode.isEmpty()) {
etVerificationCode.setError("验证码已过期,请重新获取");
etVerificationCode.requestFocus();
Toast.makeText(this, "验证码已过期,请重新获取", Toast.LENGTH_SHORT).show();
return;
}
// 注册用户
boolean success = userManager.registerUser(phone, password);
if (success) {
performRegisterSuccess(phone, password);
} else {
Toast.makeText(this, "注册失败,该手机号已注册", Toast.LENGTH_SHORT).show();
etPhone.setError("该手机号已注册");
etPhone.requestFocus();
}
}
private boolean validateRegisterInput(String phone, String code, String password) {
// 验证手机号
if (phone.isEmpty()) {
etPhone.setError("请输入手机号");
etPhone.requestFocus();
return false;
}
if (phone.length() != 11) {
etPhone.setError("手机号格式不正确");
etPhone.requestFocus();
return false;
}
if (!phone.startsWith("1")) {
etPhone.setError("手机号格式不正确");
etPhone.requestFocus();
return false;
}
// 验证验证码
if (code.isEmpty()) {
etVerificationCode.setError("请输入验证码");
etVerificationCode.requestFocus();
return false;
}
if (code.length() != 6) {
etVerificationCode.setError("验证码格式不正确");
etVerificationCode.requestFocus();
return false;
}
// 验证密码
if (password.isEmpty()) {
etPassword.setError("请输入密码");
etPassword.requestFocus();
return false;
}
if (password.length() < 6) {
etPassword.setError("密码至少6位");
etPassword.requestFocus();
return false;
}
if (password.length() > 20) {
etPassword.setError("密码最多20位");
etPassword.requestFocus();
return false;
}
return true;
}
private void performRegisterSuccess(String phone, String password) {
Toast.makeText(this, "注册成功!", Toast.LENGTH_SHORT).show();
// 自动登录
User user = userManager.loginUser(phone, password);
if (user != null) {
// 跳转到主页面
Intent intent = new Intent(RegisterActivity.this, MainActivity.class);
startActivity(intent);
finish();
} else {
// 如果自动登录失败,跳转到登录页面
Toast.makeText(this, "注册成功,请登录", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
startActivity(intent);
finish();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (countDownTimer != null) {
countDownTimer.cancel();
}
}
}

@ -0,0 +1,357 @@
package com.startsmake.llrisetabbardemo.activity;
import android.Manifest;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;
import com.startsmake.llrisetabbardemo.R;
import com.startsmake.llrisetabbardemo.model.Product;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
public class SearchActivity extends AppCompatActivity {
private EditText searchEditText;
private ImageButton backButton;
private ImageButton cameraButton;
private com.google.android.flexbox.FlexboxLayout historyContainer;
private com.google.android.flexbox.FlexboxLayout recommendContainer;
private TextView clearHistoryText;
private TextView expandHistoryText;
private SharedPreferences sharedPreferences;
private static final String SEARCH_HISTORY = "search_history";
private static final int MAX_HISTORY_COUNT = 6; // 最大存储6条
private static final int VISIBLE_HISTORY_COUNT = 4; // 默认显示4条
private boolean isHistoryExpanded = false;
// 相机相关变量
private static final int CAMERA_REQUEST_CODE = 1001;
private static final int CAMERA_PERMISSION_REQUEST_CODE = 1002;
private String currentPhotoPath;
private List<Product> allProducts;
private List<String> recommendKeywords;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
initViews();
initData();
loadSearchHistory();
setupRecommendations();
}
private void initViews() {
searchEditText = findViewById(R.id.search_edit_text);
backButton = findViewById(R.id.back_button);
cameraButton = findViewById(R.id.camera_button);
historyContainer = findViewById(R.id.history_container);
recommendContainer = findViewById(R.id.recommend_container);
clearHistoryText = findViewById(R.id.clear_history_text);
expandHistoryText = findViewById(R.id.expand_history_text);
TextView searchButton = findViewById(R.id.search_button);
// 设置返回按钮
backButton.setOnClickListener((View v) -> finish());
// 设置搜索按钮点击事件
searchButton.setOnClickListener((View v) -> {
performSearch();
});
// 设置搜索页面的相机按钮
cameraButton.setOnClickListener((View v) -> {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
openCamera();
} else {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_REQUEST_CODE);
} else {
openCamera();
}
}
});
// 设置搜索功能
searchEditText.setOnEditorActionListener((v, actionId, event) -> {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
performSearch();
return true;
}
return false;
});
// 清空历史记录
clearHistoryText.setOnClickListener((View v) -> clearSearchHistory());
// 设置展开/收起按钮
expandHistoryText.setOnClickListener((View v) -> {
isHistoryExpanded = !isHistoryExpanded;
loadSearchHistory();
});
}
private void initData() {
sharedPreferences = getSharedPreferences("search_prefs", MODE_PRIVATE);
// 初始化商品数据
allProducts = new ArrayList<>();
allProducts.add(new Product("1", "Java编程思想", "计算机专业教材", "学习资料", 45.0, ""));
allProducts.add(new Product("2", "高等数学教材", "大学数学课本", "学习资料", 30.0, ""));
allProducts.add(new Product("3", "笔记本电脑", "二手联想笔记本", "数码产品", 1200.0, ""));
allProducts.add(new Product("4", "台灯", "护眼学习台灯", "生活用品", 25.0, ""));
allProducts.add(new Product("5", "Python入门", "编程学习书籍", "学习资料", 35.0, ""));
allProducts.add(new Product("6", "机械键盘", "客制化机械键盘", "数码产品", 150.0, ""));
allProducts.add(new Product("7", "电钢琴", "雅马哈电钢琴", "乐器", 800.0, ""));
allProducts.add(new Product("8", "笔记本", "八成新游戏本", "数码产品", 2000.0, ""));
allProducts.add(new Product("9", "电动车", "二手电动车", "交通工具", 600.0, ""));
allProducts.add(new Product("10", "厚外套", "冬季保暖外套", "服装", 80.0, ""));
// 初始化推荐关键词
recommendKeywords = Arrays.asList(
"Java编程教材", "Python入门书籍", "高等数学课本", "英语四级真题", "考研政治资料", "计算机专业课", "电路分析教程", "机械制图教材", "经济学原理", "心理学导论", "设计素描本", "专业课程笔记","二手笔记本电脑", "机械键盘", "无线鼠标", "蓝牙耳机", "平板电脑", "智能手机", "充电宝", "U盘硬盘", "显示器", "路由器", "相机镜头", "游戏手柄","台灯", "插排", "收纳箱", "穿衣镜",
"瑜伽垫", "体重秤", "电风扇", "暖手宝", "床上桌", "衣柜", "鞋架", "晾衣架","羽毛球拍", "篮球足球", "滑板轮滑", "吉他乐器",
"画笔画具", "围棋象棋", "游泳装备", "健身器材", "登山背包", "帐篷睡袋", "摄影三脚架", "书法字帖"
);
}
private void loadSearchHistory() {
Set<String> historySet = sharedPreferences.getStringSet(SEARCH_HISTORY, new HashSet<>());
List<String> historyList = new ArrayList<>(historySet);
// 按照搜索顺序排序(后搜索的在前)
Collections.reverse(historyList);
historyContainer.removeAllViews();
if (historyList.isEmpty()) {
findViewById(R.id.history_title).setVisibility(View.GONE);
clearHistoryText.setVisibility(View.GONE);
expandHistoryText.setVisibility(View.GONE);
} else {
findViewById(R.id.history_title).setVisibility(View.VISIBLE);
clearHistoryText.setVisibility(View.VISIBLE);
// 计算要显示的历史记录数量
int showCount = historyList.size();
if (!isHistoryExpanded && historyList.size() > VISIBLE_HISTORY_COUNT) {
showCount = VISIBLE_HISTORY_COUNT;
}
// 显示历史记录标签
for (int i = 0; i < showCount; i++) {
String keyword = historyList.get(i);
TextView historyTag = createTagView(keyword, true);
historyContainer.addView(historyTag);
}
// 显示展开/收起按钮
if (historyList.size() > VISIBLE_HISTORY_COUNT) {
expandHistoryText.setVisibility(View.VISIBLE);
if (isHistoryExpanded) {
expandHistoryText.setText("收起");
} else {
expandHistoryText.setText("展开更多(" + (historyList.size() - VISIBLE_HISTORY_COUNT) + ")");
}
} else {
expandHistoryText.setVisibility(View.GONE);
}
}
}
private void saveSearchHistory(String query) {
Set<String> historySet = sharedPreferences.getStringSet(SEARCH_HISTORY, new HashSet<>());
Set<String> newSet = new LinkedHashSet<>(); // 使用LinkedHashSet保持顺序
// 先添加新的搜索(确保在最前面)
newSet.add(query);
// 添加其他历史记录(排除重复项)
for (String item : historySet) {
if (!item.equals(query)) {
newSet.add(item);
}
}
// 如果超过最大数量,移除最旧的
if (newSet.size() > MAX_HISTORY_COUNT) {
List<String> list = new ArrayList<>(newSet);
// 保留最新的6条
List<String> newList = list.subList(0, MAX_HISTORY_COUNT);
newSet = new LinkedHashSet<>(newList);
}
sharedPreferences.edit().putStringSet(SEARCH_HISTORY, newSet).apply();
}
// 相机相关方法保持不变
private void openCamera() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
Toast.makeText(this, "创建文件失败", Toast.LENGTH_SHORT).show();
}
if (photoFile != null) {
currentPhotoPath = photoFile.getAbsolutePath();
Uri photoURI = FileProvider.getUriForFile(this,
getPackageName() + ".fileprovider",
photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(takePictureIntent, CAMERA_REQUEST_CODE);
}
} else {
Toast.makeText(this, "未找到相机应用", Toast.LENGTH_SHORT).show();
}
}
private File createImageFile() throws IOException {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
return File.createTempFile(
imageFileName,
".jpg",
storageDir
);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_REQUEST_CODE && resultCode == RESULT_OK) {
if (currentPhotoPath != null) {
Toast.makeText(this, "拍照成功,开始搜索...", Toast.LENGTH_SHORT).show();
searchEditText.setText("图片搜索中...");
performImageSearch();
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
openCamera();
} else {
Toast.makeText(this, "需要相机权限才能拍照搜索", Toast.LENGTH_SHORT).show();
}
}
}
// 图片搜索功能
private void performImageSearch() {
List<Product> similarProducts = findSimilarProducts();
if (similarProducts.isEmpty()) {
searchEditText.setText("未找到相似商品");
Toast.makeText(this, "未找到相似商品", Toast.LENGTH_SHORT).show();
} else {
Intent intent = new Intent(this, SearchResultsActivity.class);
intent.putExtra("search_type", "image");
intent.putExtra("search_query", "图片搜索结果");
ArrayList<Product> productList = new ArrayList<>(similarProducts);
intent.putExtra("similar_products", productList);
startActivity(intent);
}
}
private List<Product> findSimilarProducts() {
List<Product> similarProducts = new ArrayList<>();
Collections.shuffle(allProducts);
similarProducts = allProducts.subList(0, Math.min(5, allProducts.size()));
return similarProducts;
}
private void setupRecommendations() {
List<String> randomRecommends = new ArrayList<>(recommendKeywords);
Collections.shuffle(randomRecommends);
List<String> selectedRecommends = randomRecommends.subList(0, Math.min(6, randomRecommends.size()));
recommendContainer.removeAllViews();
for (String keyword : selectedRecommends) {
TextView recommendTag = createTagView(keyword, false);
recommendContainer.addView(recommendTag);
}
}
private TextView createTagView(String keyword, boolean isHistory) {
TextView tagView = new TextView(this);
com.google.android.flexbox.FlexboxLayout.LayoutParams params = new com.google.android.flexbox.FlexboxLayout.LayoutParams(
com.google.android.flexbox.FlexboxLayout.LayoutParams.WRAP_CONTENT,
com.google.android.flexbox.FlexboxLayout.LayoutParams.WRAP_CONTENT
);
params.setMargins(0, 0, 16, 16);
tagView.setLayoutParams(params);
tagView.setPadding(32, 16, 32, 16);
tagView.setText(keyword);
tagView.setTextSize(14);
tagView.setBackgroundResource(R.drawable.tag_background);
tagView.setTextColor(getResources().getColor(android.R.color.darker_gray));
tagView.setOnClickListener(v -> {
searchEditText.setText(keyword);
performSearch();
});
return tagView;
}
private void performSearch() {
String query = searchEditText.getText().toString().trim();
if (!TextUtils.isEmpty(query)) {
saveSearchHistory(query);
Intent intent = new Intent(this, SearchResultsActivity.class);
intent.putExtra("search_query", query);
startActivity(intent);
}
}
private void clearSearchHistory() {
sharedPreferences.edit().remove(SEARCH_HISTORY).apply();
loadSearchHistory();
}
@Override
protected void onResume() {
super.onResume();
loadSearchHistory();
}
}

@ -0,0 +1,115 @@
package com.startsmake.llrisetabbardemo.activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.startsmake.llrisetabbardemo.R;
import com.startsmake.llrisetabbardemo.adapter.SearchAdapter;
import com.startsmake.llrisetabbardemo.model.Product;
import java.util.ArrayList;
import java.util.List;
public class SearchResultsActivity extends AppCompatActivity {
private RecyclerView resultsRecyclerView;
private TextView searchQueryText;
private SearchAdapter searchAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search_results);
initViews();
loadSearchResults();
}
private void initViews() {
resultsRecyclerView = findViewById(R.id.results_recycler_view);
searchQueryText = findViewById(R.id.search_query_text);
String query = getIntent().getStringExtra("search_query");
searchQueryText.setText("搜索结果: " + query);
searchAdapter = new SearchAdapter(new ArrayList<>());
resultsRecyclerView.setLayoutManager(new LinearLayoutManager(this));
resultsRecyclerView.setAdapter(searchAdapter);
// 设置返回按钮 - 修复Lambda表达式参数类型
findViewById(R.id.back_button).setOnClickListener((View v) -> {
// 确保数据保存后再返回
finish();
});
}
// 在 loadSearchResults() 方法中添加对图片搜索的支持
private void loadSearchResults() {
String searchType = getIntent().getStringExtra("search_type");
String query = getIntent().getStringExtra("search_query");
if ("image".equals(searchType)) {
// 图片搜索结果
List<Product> similarProducts = (List<Product>) getIntent().getSerializableExtra("similar_products");
if (similarProducts != null && !similarProducts.isEmpty()) {
searchQueryText.setText("图片搜索结果");
searchAdapter.updateData(similarProducts);
findViewById(R.id.no_results_text).setVisibility(View.GONE);
resultsRecyclerView.setVisibility(View.VISIBLE);
} else {
searchQueryText.setText("图片搜索结果");
findViewById(R.id.no_results_text).setVisibility(View.VISIBLE);
resultsRecyclerView.setVisibility(View.GONE);
}
} else {
// 文本搜索结果(原有逻辑)
if (query != null) {
searchQueryText.setText("搜索结果: " + query);
List<Product> searchResults = searchProducts(query);
if (searchResults.isEmpty()) {
findViewById(R.id.no_results_text).setVisibility(View.VISIBLE);
resultsRecyclerView.setVisibility(View.GONE);
} else {
findViewById(R.id.no_results_text).setVisibility(View.GONE);
resultsRecyclerView.setVisibility(View.VISIBLE);
searchAdapter.updateData(searchResults);
}
} else {
// 处理没有查询参数的情况
searchQueryText.setText("搜索结果");
findViewById(R.id.no_results_text).setVisibility(View.VISIBLE);
resultsRecyclerView.setVisibility(View.GONE);
}
}
}
private List<Product> searchProducts(String keyword) {
List<Product> results = new ArrayList<>();
// 这里使用模拟数据,实际应该从数据库或网络加载
List<Product> allProducts = getMockProducts();
for (Product product : allProducts) {
if (product.getName().toLowerCase().contains(keyword.toLowerCase()) ||
product.getDescription().toLowerCase().contains(keyword.toLowerCase()) ||
product.getCategory().toLowerCase().contains(keyword.toLowerCase())) {
results.add(product);
}
}
return results;
}
private List<Product> getMockProducts() {
List<Product> products = new ArrayList<>();
products.add(new Product("1", "Java编程思想", "计算机专业教材", "学习资料", 45.0, ""));
products.add(new Product("2", "高等数学教材", "大学数学课本", "学习资料", 30.0, ""));
products.add(new Product("3", "笔记本电脑", "二手联想笔记本", "数码产品", 1200.0, ""));
products.add(new Product("4", "台灯", "护眼学习台灯", "生活用品", 25.0, ""));
products.add(new Product("5", "Python入门", "编程学习书籍", "学习资料", 35.0, ""));
return products;
}
}

@ -0,0 +1,74 @@
package com.startsmake.llrisetabbardemo.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.startsmake.llrisetabbardemo.R;
import com.startsmake.llrisetabbardemo.model.ChatMessage;
import java.util.List;
public class ChatMessageAdapter extends RecyclerView.Adapter<ChatMessageAdapter.ViewHolder> {
private Context context;
private List<ChatMessage> messageList;
public ChatMessageAdapter(Context context, List<ChatMessage> messageList) {
this.context = context;
this.messageList = messageList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_chat_message, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
ChatMessage message = messageList.get(position);
if (message.isMe()) {
// 自己发送的消息 - 右侧显示
holder.layoutLeft.setVisibility(View.GONE);
holder.layoutRight.setVisibility(View.VISIBLE);
holder.tvRightMessage.setText(message.getContent());
holder.tvRightTime.setText(message.getTime());
} else {
// 对方发送的消息 - 左侧显示
holder.layoutRight.setVisibility(View.GONE);
holder.layoutLeft.setVisibility(View.VISIBLE);
holder.tvLeftMessage.setText(message.getContent());
holder.tvLeftTime.setText(message.getTime());
}
}
@Override
public int getItemCount() {
return messageList.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
LinearLayout layoutLeft;
LinearLayout layoutRight;
TextView tvLeftMessage;
TextView tvRightMessage;
TextView tvLeftTime;
TextView tvRightTime;
public ViewHolder(@NonNull View itemView) {
super(itemView);
layoutLeft = itemView.findViewById(R.id.layoutLeft);
layoutRight = itemView.findViewById(R.id.layoutRight);
tvLeftMessage = itemView.findViewById(R.id.tvLeftMessage);
tvRightMessage = itemView.findViewById(R.id.tvRightMessage);
tvLeftTime = itemView.findViewById(R.id.tvLeftTime);
tvRightTime = itemView.findViewById(R.id.tvRightTime);
}
}
}

@ -0,0 +1,84 @@
package com.startsmake.llrisetabbardemo.adapter;
import android.content.Context;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.startsmake.llrisetabbardemo.R;
import java.util.List;
public class ImageAdapter extends BaseAdapter {
private Context context;
private List<Uri> imageUris;
private static final int MAX_IMAGES = 9;
public ImageAdapter(Context context, List<Uri> imageUris) {
this.context = context;
this.imageUris = imageUris;
}
@Override
public int getCount() {
return Math.min(imageUris.size() + 1, MAX_IMAGES);
}
@Override
public Object getItem(int position) {
if (position < imageUris.size()) {
return imageUris.get(position);
}
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item_image, parent, false);
holder = new ViewHolder();
holder.imageView = convertView.findViewById(R.id.imageView);
holder.deleteButton = convertView.findViewById(R.id.btnDelete);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (position < imageUris.size()) {
// 显示已选择的图片
Uri imageUri = imageUris.get(position);
Glide.with(context)
.load(imageUri)
.placeholder(android.R.drawable.ic_menu_gallery) // 使用系统图标作为占位符
.into(holder.imageView);
holder.deleteButton.setVisibility(View.VISIBLE);
holder.deleteButton.setOnClickListener(v -> {
imageUris.remove(position);
notifyDataSetChanged();
});
} else {
// 显示添加按钮
holder.imageView.setImageResource(android.R.drawable.ic_input_add); // 使用系统图标
holder.deleteButton.setVisibility(View.GONE);
}
return convertView;
}
static class ViewHolder {
ImageView imageView;
ImageView deleteButton;
}
}

@ -0,0 +1,102 @@
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.MessageItem;
import java.util.List;
public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.ViewHolder> {
private Context context;
private List<MessageItem> messageList;
private OnItemClickListener onItemClickListener;
public MessageAdapter(Context context, List<MessageItem> messageList) {
this.context = context;
this.messageList = messageList;
}
// 添加点击监听接口
public interface OnItemClickListener {
void onItemClick(MessageItem item);
}
public void setOnItemClickListener(OnItemClickListener listener) {
this.onItemClickListener = listener;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_message, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
MessageItem item = messageList.get(position);
// 设置默认白色头像背景
holder.ivAvatar.setBackgroundResource(R.drawable.bg_avatar_placeholder);
holder.tvTitle.setText(item.getTitle());
holder.tvContent.setText(item.getContent());
holder.tvTime.setText(item.getTime());
// 未读消息数量
if (item.getUnreadCount() > 0) {
holder.tvUnreadCount.setVisibility(View.VISIBLE);
holder.tvUnreadCount.setText(String.valueOf(item.getUnreadCount()));
} else {
holder.tvUnreadCount.setVisibility(View.GONE);
}
// 官方标识
if (item.isOfficial()) {
holder.ivOfficial.setVisibility(View.VISIBLE);
} else {
holder.ivOfficial.setVisibility(View.GONE);
}
// 添加点击事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onItemClickListener != null) {
onItemClickListener.onItemClick(item);
}
}
});
}
@Override
public int getItemCount() {
return messageList.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
ImageView ivAvatar;
TextView tvTitle;
TextView tvContent;
TextView tvTime;
TextView tvUnreadCount;
ImageView ivOfficial;
public ViewHolder(@NonNull View itemView) {
super(itemView);
ivAvatar = itemView.findViewById(R.id.ivAvatar);
tvTitle = itemView.findViewById(R.id.tvTitle);
tvContent = itemView.findViewById(R.id.tvContent);
tvTime = itemView.findViewById(R.id.tvTime);
tvUnreadCount = itemView.findViewById(R.id.tvUnreadCount);
ivOfficial = itemView.findViewById(R.id.ivOfficial);
}
}
}

@ -0,0 +1,64 @@
package com.startsmake.llrisetabbardemo.adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.startsmake.llrisetabbardemo.R;
import com.startsmake.llrisetabbardemo.model.Product;
import java.util.List;
public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder> {
private List<Product> productList;
public SearchAdapter(List<Product> productList) {
this.productList = productList;
}
public void updateData(List<Product> newList) {
this.productList = newList;
notifyDataSetChanged();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_product, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Product product = productList.get(position);
holder.productName.setText(product.getName());
holder.productDescription.setText(product.getDescription());
holder.productCategory.setText(product.getCategory());
holder.productPrice.setText(String.format("¥%.2f", product.getPrice()));
}
@Override
public int getItemCount() {
return productList.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
TextView productName;
TextView productDescription;
TextView productCategory;
TextView productPrice;
public ViewHolder(@NonNull View itemView) {
super(itemView);
productName = itemView.findViewById(R.id.product_name);
productDescription = itemView.findViewById(R.id.product_description);
productCategory = itemView.findViewById(R.id.product_category);
productPrice = itemView.findViewById(R.id.product_price);
}
}
}

@ -1,12 +1,14 @@
package com.startsmake.llrisetabbardemo.fragment;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
// 改为 AndroidX
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.startsmake.llrisetabbardemo.R;
/**
@ -21,4 +23,4 @@ public class CityFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_city, container, false);
}
}
}

@ -1,13 +1,50 @@
package com.startsmake.llrisetabbardemo.fragment;
import android.app.Fragment;
import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.Context;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.os.Environment;
import android.os.Handler;
import android.provider.MediaStore;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.startsmake.llrisetabbardemo.R;
import com.startsmake.llrisetabbardemo.adapter.SearchAdapter;
import com.startsmake.llrisetabbardemo.activity.SearchActivity;
import com.startsmake.llrisetabbardemo.activity.SearchResultsActivity;
import com.startsmake.llrisetabbardemo.model.Product;
import com.startsmake.llrisetabbardemo.model.Item;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Locale;
/**
* User:Shine
@ -15,6 +52,76 @@ import com.startsmake.llrisetabbardemo.R;
* Description:
*/
public class HomeFragment extends Fragment {
private static final String TAG = "HomeFragment";
public void addNewItem(Item item) {
try {
Log.d(TAG, "开始添加新商品");
if (item == null) {
Log.e(TAG, "尝试添加空商品");
Toast.makeText(requireContext(), "商品信息无效", Toast.LENGTH_SHORT).show();
return;
}
if (productList == null) {
productList = new ArrayList<>();
}
// 将Item转换为Product根据你的数据结构调整
Product newProduct = new Product();
newProduct.setId(String.valueOf(System.currentTimeMillis()));
newProduct.setName(item.getTitle());
newProduct.setDescription(item.getDescription());
newProduct.setCategory(item.getCategory());
newProduct.setPrice(item.getPrice());
newProduct.setImageUrl(""); // 如果没有图片,设为空字符串
// 添加到列表顶部
productList.add(0, newProduct);
// 更新适配器
if (searchAdapter != null) {
searchAdapter.updateData(productList);
}
// 显示商品列表,隐藏空状态
if (homeProductsRecyclerView != null && homeNoProductsText != null) {
homeProductsRecyclerView.setVisibility(View.VISIBLE);
homeNoProductsText.setVisibility(View.GONE);
}
Toast.makeText(requireContext(), "商品发布成功!", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Log.e(TAG, "添加新商品时出错", e);
Toast.makeText(requireContext(), "添加商品失败,请重试", Toast.LENGTH_SHORT).show();
}
}
private EditText searchEditText;
private ImageButton cameraButton;
private TextView homeSearchButton;
// 首页商品展示相关
private RecyclerView homeProductsRecyclerView;
private TextView homeNoProductsText;
private LinearLayout defaultContent;
// 导航栏按钮
private RadioButton tabFollow;
private TextView tabRecommend, tabNew, tabStudy, tabLiving;
// 随机标签相关
private List<String> randomKeywords;
private Handler handler;
private Runnable keywordRunnable;
private static final long KEYWORD_CHANGE_INTERVAL = 3000;
private static final int CAMERA_REQUEST_CODE = 101;
private static final int CAMERA_PERMISSION_REQUEST_CODE = 102;
private String currentPhotoPath;
private List<Product> productList;
private SearchAdapter searchAdapter;
@Nullable
@Override
@ -22,4 +129,421 @@ public class HomeFragment extends Fragment {
return inflater.inflate(R.layout.fragment_home, container, false);
}
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initViews(view);
initSearchData();
initRandomKeywords();
setupNavigationButtons();
startKeywordRotation();
// 默认显示推荐内容
showRandomRecommendations();
tabRecommend.setTextColor(0xffff6b35);
}
private void initViews(View view) {
searchEditText = view.findViewById(R.id.search_edit_text);
cameraButton = view.findViewById(R.id.camera_button);
homeSearchButton = view.findViewById(R.id.home_search_button);
// 首页商品展示相关视图
homeProductsRecyclerView = view.findViewById(R.id.home_products_recycler_view);
homeNoProductsText = view.findViewById(R.id.home_no_products_text);
defaultContent = view.findViewById(R.id.default_content);
// 初始化导航栏按钮
tabFollow = view.findViewById(R.id.tab_follow);
tabRecommend = view.findViewById(R.id.tab_recommend);
tabNew = view.findViewById(R.id.tab_new);
tabStudy = view.findViewById(R.id.tab_study);
tabLiving = view.findViewById(R.id.tab_living);
// 设置首页商品RecyclerView
setupHomeProductsRecyclerView();
searchEditText.setOnClickListener(v -> {
try {
Log.d(TAG, "搜索框被点击");
// 使用requireActivity()确保Activity不为null
Intent intent = new Intent(requireActivity(), SearchActivity.class);
startActivity(intent);
} catch (Exception e) {
Log.e(TAG, "点击搜索框时出错", e);
Toast.makeText(requireContext(), "打开搜索页面失败,请重试", Toast.LENGTH_SHORT).show();
}
});
homeSearchButton.setOnClickListener(v -> {
try {
Log.d(TAG, "搜索按钮被点击");
performHomeSearch();
} catch (Exception e) {
Log.e(TAG, "执行搜索时出错", e);
Toast.makeText(requireContext(), "搜索功能暂不可用,请稍后再试", Toast.LENGTH_SHORT).show();
}
});
cameraButton.setOnClickListener(v -> {
if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
openCamera();
} else {
requestPermissions(new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_REQUEST_CODE);
}
});
}
// 设置首页商品RecyclerView
private void setupHomeProductsRecyclerView() {
homeProductsRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
searchAdapter = new SearchAdapter(new ArrayList<>());
homeProductsRecyclerView.setAdapter(searchAdapter);
}
// 设置导航栏按钮点击事件
private void setupNavigationButtons() {
// 关注按钮
tabFollow.setOnClickListener(v -> {
resetTabColors();
tabFollow.setTextColor(0xffff6b35);
showFollowedProducts();
});
// 推荐按钮
tabRecommend.setOnClickListener(v -> {
resetTabColors();
tabRecommend.setTextColor(0xffff6b35);
showRandomRecommendations();
});
// 新发布按钮
tabNew.setOnClickListener(v -> {
resetTabColors();
tabNew.setTextColor(0xffff6b35);
showNewProducts();
});
// 学习资料按钮
tabStudy.setOnClickListener(v -> {
resetTabColors();
tabStudy.setTextColor(0xffff6b35);
showStudyProducts();
});
// 生活用品按钮
tabLiving.setOnClickListener(v -> {
resetTabColors();
tabLiving.setTextColor(0xffff6b35);
showLifeProducts();
});
}
// 重置所有标签颜色为未选中状态
private void resetTabColors() {
tabFollow.setTextColor(0xff666666);
tabRecommend.setTextColor(0xff666666);
tabNew.setTextColor(0xff666666);
tabStudy.setTextColor(0xff666666);
tabLiving.setTextColor(0xff666666);
}
// 显示随机推荐商品
private void showRandomRecommendations() {
if (productList == null || productList.isEmpty()) {
showNoProducts();
return;
}
List<Product> shuffledList = new ArrayList<>(productList);
Collections.shuffle(shuffledList);
int count = Math.min(6, shuffledList.size());
List<Product> randomProducts = shuffledList.subList(0, count);
showHomeProducts(randomProducts);
Toast.makeText(requireContext(), "为您推荐", Toast.LENGTH_SHORT).show();
}
// 显示新发布商品
private void showNewProducts() {
List<Product> newProducts = new ArrayList<>();
for (Product product : productList) {
if (Integer.parseInt(product.getId()) > 3) {
newProducts.add(product);
}
}
if (newProducts.isEmpty()) {
showNoProducts();
} else {
showHomeProducts(newProducts);
Toast.makeText(requireContext(), "新发布商品", Toast.LENGTH_SHORT).show();
}
}
// 显示学习资料类商品
private void showStudyProducts() {
List<Product> studyProducts = new ArrayList<>();
for (Product product : productList) {
if ("学习资料".equals(product.getCategory())) {
studyProducts.add(product);
}
}
if (studyProducts.isEmpty()) {
showNoProducts();
} else {
showHomeProducts(studyProducts);
Toast.makeText(requireContext(), "学习资料", Toast.LENGTH_SHORT).show();
}
}
// 显示生活用品类商品
private void showLifeProducts() {
List<Product> lifeProducts = new ArrayList<>();
for (Product product : productList) {
if ("生活用品".equals(product.getCategory())) {
lifeProducts.add(product);
}
}
if (lifeProducts.isEmpty()) {
showNoProducts();
} else {
showHomeProducts(lifeProducts);
Toast.makeText(requireContext(), "生活用品", Toast.LENGTH_SHORT).show();
}
}
// 显示关注用户的商品
private void showFollowedProducts() {
List<Product> followedProducts = new ArrayList<>();
if (productList.size() >= 2) {
followedProducts.add(productList.get(0));
followedProducts.add(productList.get(1));
}
if (followedProducts.isEmpty()) {
showNoProducts();
Toast.makeText(requireContext(), "您还没有关注任何用户", Toast.LENGTH_SHORT).show();
} else {
showHomeProducts(followedProducts);
Toast.makeText(requireContext(), "关注用户的商品", Toast.LENGTH_SHORT).show();
}
}
// 在首页显示商品
private void showHomeProducts(List<Product> products) {
searchAdapter.updateData(products);
homeProductsRecyclerView.setVisibility(View.VISIBLE);
homeNoProductsText.setVisibility(View.GONE);
defaultContent.setVisibility(View.GONE);
}
// 显示暂无商品
private void showNoProducts() {
homeProductsRecyclerView.setVisibility(View.GONE);
homeNoProductsText.setVisibility(View.VISIBLE);
defaultContent.setVisibility(View.GONE);
}
// 显示默认内容
private void showDefaultContent() {
homeProductsRecyclerView.setVisibility(View.GONE);
homeNoProductsText.setVisibility(View.GONE);
defaultContent.setVisibility(View.VISIBLE);
}
// 初始化随机标签列表
private void initRandomKeywords() {
randomKeywords = Arrays.asList(
"Java编程教材", "Python入门书籍", "高等数学课本", "英语四级真题", "考研政治资料", "计算机专业课", "电路分析教程", "机械制图教材", "经济学原理", "心理学导论", "设计素描本", "专业课程笔记","二手笔记本电脑", "机械键盘", "无线鼠标", "蓝牙耳机", "平板电脑", "智能手机", "充电宝", "U盘硬盘", "显示器", "路由器", "相机镜头", "游戏手柄", "收纳箱", "穿衣镜",
"瑜伽垫", "体重秤", "电风扇", "暖手宝", "床上桌", "衣柜", "鞋架", "晾衣架","羽毛球拍", "篮球足球", "滑板轮滑", "吉他乐器",
"画笔画具", "围棋象棋", "游泳装备", "健身器材", "登山背包", "帐篷睡袋", "摄影三脚架", "书法字帖"
);
handler = new Handler();
}
// 开始标签轮换
private void startKeywordRotation() {
keywordRunnable = new Runnable() {
@Override
public void run() {
if (randomKeywords != null && !randomKeywords.isEmpty()) {
Collections.shuffle(randomKeywords);
String randomKeyword = randomKeywords.get(0);
searchEditText.setHint(randomKeyword);
}
handler.postDelayed(this, KEYWORD_CHANGE_INTERVAL);
}
};
handler.post(keywordRunnable);
}
// 首页搜索功能
private void performHomeSearch() {
try {
if (searchEditText == null) {
Log.e(TAG, "搜索框对象为null");
Toast.makeText(requireContext(), "搜索组件初始化失败", Toast.LENGTH_SHORT).show();
return;
}
String currentHint = searchEditText.getHint().toString();
String defaultHint = getResources().getString(R.string.search_hint);
Log.d(TAG, "执行首页搜索,当前提示词: " + currentHint);
if (!currentHint.equals(defaultHint) && randomKeywords != null && randomKeywords.contains(currentHint)) {
// 使用requireActivity()确保Activity不为null
Intent intent = new Intent(requireActivity(), SearchResultsActivity.class);
intent.putExtra("search_query", currentHint);
startActivity(intent);
Log.d(TAG, "跳转到搜索结果页面,查询: " + currentHint);
} else {
// 使用requireActivity()确保Activity不为null
Intent intent = new Intent(requireActivity(), SearchActivity.class);
startActivity(intent);
Log.d(TAG, "跳转到搜索页面");
}
} catch (Exception e) {
Log.e(TAG, "执行首页搜索时出错", e);
Toast.makeText(requireContext(), "搜索功能暂不可用,请稍后再试", Toast.LENGTH_SHORT).show();
}
}
private void initSearchData() {
productList = new ArrayList<>();
productList.add(new Product("1", "Java编程思想", "计算机专业教材", "学习资料", 45.0, ""));
productList.add(new Product("2", "高等数学教材", "大学数学课本", "学习资料", 30.0, ""));
productList.add(new Product("3", "笔记本电脑", "二手联想笔记本", "数码产品", 1200.0, ""));
productList.add(new Product("4", "台灯", "护眼学习台灯", "生活用品", 25.0, ""));
productList.add(new Product("5", "Python入门", "编程学习书籍", "学习资料", 35.0, ""));
productList.add(new Product("6", "数据结构与算法", "计算机专业书籍", "学习资料", 40.0, ""));
productList.add(new Product("7", "水杯", "保温水杯", "生活用品", 20.0, ""));
productList.add(new Product("8", "插排", "多功能插排", "生活用品", 35.0, ""));
}
// 原有的搜索方法保持不变
private void performSearch() {
String query = searchEditText.getText().toString().trim();
if (!query.isEmpty()) {
hideKeyboard();
List<Product> searchResults = searchProducts(query);
if (searchResults.isEmpty()) {
// 这里使用原有的搜索结果显示逻辑
showNoResults();
} else {
// 这里使用原有的搜索结果显示逻辑
showSearchResults(searchResults);
}
} else {
showDefaultContent();
}
}
// 原有的搜索结果显示方法
private void showSearchResults(List<Product> results) {
// 这里使用原有的搜索结果RecyclerView
// searchAdapter.updateData(results);
// searchResultsRecyclerView.setVisibility(View.VISIBLE);
// noResultsText.setVisibility(View.GONE);
// defaultContent.setVisibility(View.GONE);
}
private void showNoResults() {
// 原有的无结果显示逻辑
// searchResultsRecyclerView.setVisibility(View.GONE);
// noResultsText.setVisibility(View.VISIBLE);
// defaultContent.setVisibility(View.GONE);
}
private List<Product> searchProducts(String keyword) {
List<Product> results = new ArrayList<>();
for (Product product : productList) {
if (product.getName().toLowerCase().contains(keyword.toLowerCase()) ||
product.getDescription().toLowerCase().contains(keyword.toLowerCase()) ||
product.getCategory().toLowerCase().contains(keyword.toLowerCase())) {
results.add(product);
}
}
return results;
}
// 隐藏软键盘的方法
private void hideKeyboard() {
InputMethodManager imm = (InputMethodManager) requireContext().getSystemService(Context.INPUT_METHOD_SERVICE);
View currentFocus = requireActivity().getCurrentFocus();
if (currentFocus != null) {
imm.hideSoftInputFromWindow(currentFocus.getWindowToken(), 0);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
openCamera();
} else {
Toast.makeText(requireContext(), "需要相机权限才能拍照搜索", Toast.LENGTH_SHORT).show();
}
}
}
private void openCamera() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(requireActivity().getPackageManager()) != null) {
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
Toast.makeText(requireContext(), "创建文件失败", Toast.LENGTH_SHORT).show();
}
if (photoFile != null) {
currentPhotoPath = photoFile.getAbsolutePath();
Uri photoURI = FileProvider.getUriForFile(requireContext(),
requireContext().getPackageName() + ".fileprovider",
photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(takePictureIntent, CAMERA_REQUEST_CODE);
}
} else {
Toast.makeText(requireContext(), "未找到相机应用", Toast.LENGTH_SHORT).show();
}
}
private File createImageFile() throws IOException {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = requireContext().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
return File.createTempFile(
imageFileName,
".jpg",
storageDir
);
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
if (currentPhotoPath != null) {
Toast.makeText(requireContext(), "拍照成功,开始搜索...", Toast.LENGTH_SHORT).show();
searchEditText.setText("图片搜索中...");
performSearch();
}
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
if (handler != null && keywordRunnable != null) {
handler.removeCallbacks(keywordRunnable);
}
}
}

@ -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();
});
}
}

@ -1,24 +1,65 @@
package com.startsmake.llrisetabbardemo.fragment;
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.startsmake.llrisetabbardemo.R;
import com.startsmake.llrisetabbardemo.activity.ChatActivity;
import com.startsmake.llrisetabbardemo.adapter.MessageAdapter;
import com.startsmake.llrisetabbardemo.model.MessageItem;
import java.util.ArrayList;
import java.util.List;
/**
* User:Shine
* Date:2015-10-20
* Description:
*/
public class MessageFragment extends Fragment {
private RecyclerView rvMessageList;
private MessageAdapter messageAdapter;
private List<MessageItem> messageList;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_message, container, false);
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_message, container, false);
initView(view);
initData();
return view;
}
private void initView(View view) {
rvMessageList = view.findViewById(R.id.rvMessageList);
rvMessageList.setLayoutManager(new LinearLayoutManager(getContext()));
}
private void initData() {
messageList = new ArrayList<>();
// 添加消息数据 - 所有头像都使用白色背景
messageList.add(new MessageItem("通知消息", "红包到账提醒", "刚刚", 0, true));
messageList.add(new MessageItem("互动消息", "还没有新通知~", "", 0, false));
messageList.add(new MessageItem("闲鱼精选", "[347条] 关注的宝贝上新捡漏...", "6小时前", 347, false));
messageList.add(new MessageItem("刑事组之虎", "快给ta一个评价吧", "04-19", 0, false));
messageList.add(new MessageItem("卖家小助手", "开启急速转卖通道!", "05-25", 0, true));
messageList.add(new MessageItem("豫中玩具批…", "[我完成了评价]", "04-18", 0, false));
messageAdapter = new MessageAdapter(getContext(), messageList);
rvMessageList.setAdapter(messageAdapter);
// 添加点击监听
messageAdapter.setOnItemClickListener(new MessageAdapter.OnItemClickListener() {
@Override
public void onItemClick(MessageItem item) {
// 跳转到聊天页面
Intent intent = new Intent(getActivity(), ChatActivity.class);
intent.putExtra("chat_title", item.getTitle());
startActivity(intent);
}
});
}
}
}

@ -1,24 +1,195 @@
package com.startsmake.llrisetabbardemo.fragment;
import android.app.Fragment;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment;
import com.startsmake.llrisetabbardemo.R;
import com.startsmake.llrisetabbardemo.activity.LoginActivity;
import com.startsmake.llrisetabbardemo.manager.UserManager;
/**
* User:Shine
* Date:2015-10-20
* Description:
*/
public class PersonFragment extends Fragment {
private View mLogoutLayout;
private TextView tvUsername, tvUserDesc, tvCreditScore, tvMemberLevel;
private TextView tvWantCount, tvSellingCount, tvSoldCount, tvSavedMoney;
private UserManager userManager;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_person, container, false);
View view = inflater.inflate(R.layout.fragment_person, container, false);
userManager = UserManager.getInstance(requireContext());
initView(view);
setListeners();
updateUI();
return view;
}
private void initView(View view) {
mLogoutLayout = view.findViewById(R.id.ll_logout);
tvUsername = view.findViewById(R.id.tv_username);
tvUserDesc = view.findViewById(R.id.tv_user_desc);
tvCreditScore = view.findViewById(R.id.tv_credit_score);
tvMemberLevel = view.findViewById(R.id.tv_member_level);
tvWantCount = view.findViewById(R.id.tv_want_count);
tvSellingCount = view.findViewById(R.id.tv_selling_count);
tvSoldCount = view.findViewById(R.id.tv_sold_count);
tvSavedMoney = view.findViewById(R.id.tv_saved_money);
}
private void setListeners() {
// 退出登录按钮
if (mLogoutLayout != null) {
mLogoutLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showLogoutDialog();
}
});
}
// 用户名点击登录
if (tvUsername != null) {
tvUsername.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!isUserLoggedIn()) {
navigateToLogin();
}
}
});
}
// 用户描述点击登录
if (tvUserDesc != null) {
tvUserDesc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!isUserLoggedIn()) {
navigateToLogin();
}
}
});
}
}
private void showLogoutDialog() {
if (!isUserLoggedIn()) {
Toast.makeText(getActivity(), "您还未登录", Toast.LENGTH_SHORT).show();
navigateToLogin();
return;
}
new AlertDialog.Builder(requireContext())
.setTitle("退出登录")
.setMessage("确定要退出登录吗?退出后可以使用原账号重新登录")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
performLogout();
}
})
.setNegativeButton("取消", null)
.show();
}
private void performLogout() {
// 只清除登录状态,不删除用户数据
clearLoginStatusOnly();
// 更新UI
updateUI();
Toast.makeText(getActivity(), "已退出登录", Toast.LENGTH_SHORT).show();
}
private void clearLoginStatusOnly() {
try {
// 方法1: 使用UserManager退出登录只清除登录状态
if (userManager != null) {
userManager.logout();
}
// 方法2: 只清除登录状态,保留用户数据
SharedPreferences spUser = requireActivity().getSharedPreferences("user_info", android.content.Context.MODE_PRIVATE);
SharedPreferences.Editor editorUser = spUser.edit();
// 只清除登录相关状态,不清除用户数据
editorUser.putBoolean("is_logged_in", false);
editorUser.remove("user_token");
// 注意:不要清除 user_phone 和 user_name这样用户重新登录时可以直接显示
editorUser.apply();
} catch (Exception e) {
Toast.makeText(getActivity(), "退出登录失败", Toast.LENGTH_SHORT).show();
}
}
private void updateUI() {
if (isUserLoggedIn()) {
// 用户已登录的状态
SharedPreferences sp = requireActivity().getSharedPreferences("user_info", android.content.Context.MODE_PRIVATE);
String username = sp.getString("user_name", "用户");
if (tvUsername != null) tvUsername.setText(username);
if (tvUserDesc != null) tvUserDesc.setText("省钱达人,精明购物");
if (tvCreditScore != null) tvCreditScore.setVisibility(View.VISIBLE);
if (tvMemberLevel != null) tvMemberLevel.setVisibility(View.VISIBLE);
if (tvWantCount != null) tvWantCount.setText("5");
if (tvSellingCount != null) tvSellingCount.setText("3");
if (tvSoldCount != null) tvSoldCount.setText("12");
if (tvSavedMoney != null) tvSavedMoney.setText("¥256");
} else {
// 用户未登录的状态
if (tvUsername != null) tvUsername.setText("点击登录");
if (tvUserDesc != null) tvUserDesc.setText("登录查看个人数据");
if (tvCreditScore != null) tvCreditScore.setVisibility(View.GONE);
if (tvMemberLevel != null) tvMemberLevel.setVisibility(View.GONE);
if (tvWantCount != null) tvWantCount.setText("0");
if (tvSellingCount != null) tvSellingCount.setText("0");
if (tvSoldCount != null) tvSoldCount.setText("0");
if (tvSavedMoney != null) tvSavedMoney.setText("¥0");
}
}
private boolean isUserLoggedIn() {
SharedPreferences sp = requireActivity().getSharedPreferences("user_info", android.content.Context.MODE_PRIVATE);
return sp.getBoolean("is_logged_in", false);
}
private void navigateToLogin() {
try {
Intent intent = new Intent(getActivity(), LoginActivity.class);
startActivity(intent);
if (getActivity() != null) {
getActivity().overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
} catch (Exception e) {
Toast.makeText(getActivity(), "跳转失败,请重试", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onResume() {
super.onResume();
updateUI();
}
}
}

@ -0,0 +1,193 @@
package com.startsmake.llrisetabbardemo.fragment;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.Spinner;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.startsmake.llrisetabbardemo.R;
import com.startsmake.llrisetabbardemo.activity.MainActivity;
import com.startsmake.llrisetabbardemo.adapter.ImageAdapter;
import com.startsmake.llrisetabbardemo.model.Item;
import java.util.ArrayList;
import java.util.List;
public class PublishFragment extends Fragment {
private static final int REQUEST_CODE_PICK_IMAGES = 1001;
private static final int MAX_IMAGE_COUNT = 9;
private EditText etTitle, etDescription, etPrice, etContact;
private Spinner spinnerCategory, spinnerLocation;
private GridView gridViewImages;
private Button btnPublish;
private ImageAdapter imageAdapter;
private List<Uri> selectedImages = new ArrayList<>();
public PublishFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_publish, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initViews(view);
setupSpinners();
setupImageGrid();
setupClickListeners();
}
private void initViews(View view) {
etTitle = view.findViewById(R.id.etTitle);
etDescription = view.findViewById(R.id.etDescription);
etPrice = view.findViewById(R.id.etPrice);
etContact = view.findViewById(R.id.etContact);
spinnerCategory = view.findViewById(R.id.spinnerCategory);
spinnerLocation = view.findViewById(R.id.spinnerLocation);
gridViewImages = view.findViewById(R.id.gridViewImages);
btnPublish = view.findViewById(R.id.btnPublish);
}
private void setupSpinners() {
String[] categories = {"数码产品", "服装鞋帽", "家居日用", "图书文具", "美妆个护", "运动户外", "其他"};
ArrayAdapter<String> categoryAdapter = new ArrayAdapter<>(
requireContext(), android.R.layout.simple_spinner_item, categories);
categoryAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerCategory.setAdapter(categoryAdapter);
String[] locations = {"北京", "上海", "广州", "深圳", "杭州", "成都", "武汉", "其他"};
ArrayAdapter<String> locationAdapter = new ArrayAdapter<>(
requireContext(), android.R.layout.simple_spinner_item, locations);
locationAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerLocation.setAdapter(locationAdapter);
}
private void setupImageGrid() {
imageAdapter = new ImageAdapter(requireContext(), selectedImages);
gridViewImages.setAdapter(imageAdapter);
}
private void setupClickListeners() {
gridViewImages.setOnItemClickListener((parent, view, position, id) -> {
if (position == selectedImages.size() && selectedImages.size() < MAX_IMAGE_COUNT) {
openImagePicker();
}
});
btnPublish.setOnClickListener(v -> publishItem());
}
private void openImagePicker() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(Intent.createChooser(intent, "选择图片"), REQUEST_CODE_PICK_IMAGES);
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_PICK_IMAGES && resultCode == Activity.RESULT_OK) {
if (data != null) {
if (data.getClipData() != null) {
int count = Math.min(data.getClipData().getItemCount(),
MAX_IMAGE_COUNT - selectedImages.size());
for (int i = 0; i < count; i++) {
Uri imageUri = data.getClipData().getItemAt(i).getUri();
selectedImages.add(imageUri);
}
} else if (data.getData() != null) {
selectedImages.add(data.getData());
}
imageAdapter.notifyDataSetChanged();
}
}
}
private void publishItem() {
String title = etTitle.getText().toString().trim();
String description = etDescription.getText().toString().trim();
String priceStr = etPrice.getText().toString().trim();
String contact = etContact.getText().toString().trim();
// 验证逻辑保持不变...
try {
double price = Double.parseDouble(priceStr);
if (price <= 0) {
Toast.makeText(requireContext(), "价格必须大于0", Toast.LENGTH_SHORT).show();
return;
}
// 创建物品对象
Item item = new Item();
item.setTitle(title);
item.setDescription(description);
item.setPrice(price);
item.setContact(contact);
item.setCategory(spinnerCategory.getSelectedItem().toString());
item.setLocation(spinnerLocation.getSelectedItem().toString());
item.setPublishTime(System.currentTimeMillis());
item.setUserId("user_" + System.currentTimeMillis());
// 保存图片URL这里简化处理实际应该上传到服务器
// item.setImageUrls(imageUrls);
// 发布成功
Toast.makeText(requireContext(), "发布成功!", Toast.LENGTH_SHORT).show();
clearForm();
// 将新商品添加到主页列表
if (getActivity() instanceof MainActivity) {
MainActivity mainActivity = (MainActivity) getActivity();
// 获取HomeFragment并添加新商品
HomeFragment homeFragment = mainActivity.getHomeFragment();
if (homeFragment != null) {
homeFragment.addNewItem(item);
}
// 返回首页
mainActivity.switchToHomeFragment();
}
} catch (NumberFormatException e) {
Toast.makeText(requireContext(), "请输入有效的价格", Toast.LENGTH_SHORT).show();
}
}
private void clearForm() {
etTitle.setText("");
etDescription.setText("");
etPrice.setText("");
etContact.setText("");
selectedImages.clear();
imageAdapter.notifyDataSetChanged();
spinnerCategory.setSelection(0);
spinnerLocation.setSelection(0);
}
}

@ -0,0 +1,188 @@
package com.startsmake.llrisetabbardemo.manager;
import android.content.SharedPreferences;
import android.content.Context;
import com.startsmake.llrisetabbardemo.model.User;
import com.google.gson.Gson;
import java.util.HashSet;
import java.util.Set;
public class UserManager {
private static final String PREF_NAME = "user_data";
private static final String KEY_USERS = "registered_users";
private static final String KEY_CURRENT_USER = "current_user";
private static UserManager instance;
private SharedPreferences preferences;
private Gson gson;
private UserManager(Context context) {
preferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
gson = new Gson();
}
public static synchronized UserManager getInstance(Context context) {
if (instance == null) {
instance = new UserManager(context);
}
return instance;
}
/**
*
*/
public boolean isLoggedIn() {
return preferences.getBoolean("is_logged_in", false);
}
/**
*
*/
public boolean isPhoneRegistered(String phone) {
Set<String> usersSet = preferences.getStringSet(KEY_USERS, new HashSet<>());
for (String userJson : usersSet) {
User user = gson.fromJson(userJson, User.class);
if (user.getPhone().equals(phone)) {
return true;
}
}
return false;
}
/**
*
*/
public boolean registerUser(String phone, String password) {
// 检查手机号是否已注册
if (isPhoneRegistered(phone)) {
return false;
}
// 创建新用户
User newUser = new User(phone, password);
String userJson = gson.toJson(newUser);
Set<String> usersSet = preferences.getStringSet(KEY_USERS, new HashSet<>());
Set<String> newUsersSet = new HashSet<>(usersSet);
newUsersSet.add(userJson);
return preferences.edit().putStringSet(KEY_USERS, newUsersSet).commit();
}
/**
*
*/
public User loginUser(String phone, String password) {
Set<String> usersSet = preferences.getStringSet(KEY_USERS, new HashSet<>());
for (String userJson : usersSet) {
User user = gson.fromJson(userJson, User.class);
if (user.getPhone().equals(phone) && user.getPassword().equals(password)) {
// 保存当前用户信息
saveCurrentUser(user);
return user;
}
}
return null;
}
/**
*
*/
public boolean resetPassword(String phone, String newPassword) {
Set<String> usersSet = preferences.getStringSet(KEY_USERS, new HashSet<>());
Set<String> newUsersSet = new HashSet<>();
boolean found = false;
for (String userJson : usersSet) {
User user = gson.fromJson(userJson, User.class);
if (user.getPhone().equals(phone)) {
// 更新密码
user.setPassword(newPassword);
found = true;
}
newUsersSet.add(gson.toJson(user));
}
if (found) {
boolean success = preferences.edit().putStringSet(KEY_USERS, newUsersSet).commit();
if (success) {
// 如果重置的是当前登录用户,更新当前用户信息
User currentUser = getCurrentUser();
if (currentUser != null && currentUser.getPhone().equals(phone)) {
currentUser.setPassword(newPassword);
saveCurrentUser(currentUser);
}
}
return success;
}
return false;
}
/**
*
*/
private void saveCurrentUser(User user) {
String userJson = gson.toJson(user);
preferences.edit()
.putString(KEY_CURRENT_USER, userJson)
.putBoolean("is_logged_in", true)
.putString("user_phone", user.getPhone())
.putString("user_name", user.getUsername())
.apply();
}
/**
*
*/
public User getCurrentUser() {
String userJson = preferences.getString(KEY_CURRENT_USER, null);
if (userJson != null) {
return gson.fromJson(userJson, User.class);
}
return null;
}
/**
*
*/
public void logout() {
preferences.edit()
.remove(KEY_CURRENT_USER)
.putBoolean("is_logged_in", false)
.remove("user_phone")
.remove("user_name")
.apply();
}
/**
*
*/
public void saveUserLogin(String phone, String password) {
User user = loginUser(phone, password);
if (user != null) {
saveCurrentUser(user);
}
}
/**
*
*/
public boolean validateLogin(String phone, String password) {
return loginUser(phone, password) != null;
}
/**
*
*/
public boolean isUserExists(String phone) {
return isPhoneRegistered(phone);
}
/**
*
*/
public boolean updatePassword(String phone, String newPassword) {
return resetPassword(phone, newPassword);
}
}

@ -0,0 +1,28 @@
package com.startsmake.llrisetabbardemo.model;
public class ChatMessage {
private String sender;
private String content;
private String time;
private boolean isMe;
public ChatMessage(String sender, String content, String time, boolean isMe) {
this.sender = sender;
this.content = content;
this.time = time;
this.isMe = isMe;
}
// Getter and Setter methods
public String getSender() { return sender; }
public void setSender(String sender) { this.sender = sender; }
public String getContent() { return content; }
public void setContent(String content) { this.content = content; }
public String getTime() { return time; }
public void setTime(String time) { this.time = time; }
public boolean isMe() { return isMe; }
public void setMe(boolean me) { isMe = me; }
}

@ -0,0 +1,111 @@
package com.startsmake.llrisetabbardemo.model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class Item implements Serializable {
private String id;
private String title;
private String description;
private double price;
private List<String> imageUrls;
private String category;
private String location;
private String contact;
private String contactQQ; // 新增QQ联系方式
private String contactWechat; // 新增微信联系方式
private long publishTime;
private String userId;
private int viewCount; // 浏览数
private int likeCount; // 点赞数
public Item() {
imageUrls = new ArrayList<>();
viewCount = 0;
likeCount = 0;
}
// 构造函数
public Item(String title, String description, double price, String category, String location, String contact) {
this();
this.title = title;
this.description = description;
this.price = price;
this.category = category;
this.location = location;
this.contact = contact;
this.publishTime = System.currentTimeMillis();
this.userId = "user_" + System.currentTimeMillis();
}
// Getter 和 Setter 方法
public String getId() { return id; }
public void setId(String id) { this.id = id; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public String getDescription() { return description; }
public void setDescription(String description) { this.description = description; }
public double getPrice() { return price; }
public void setPrice(double price) { this.price = price; }
public List<String> getImageUrls() { return imageUrls; }
public void setImageUrls(List<String> imageUrls) { this.imageUrls = imageUrls; }
public void addImageUrl(String imageUrl) { this.imageUrls.add(imageUrl); }
public String getCategory() { return category; }
public void setCategory(String category) { this.category = category; }
public String getLocation() { return location; }
public void setLocation(String location) { this.location = location; }
public String getContact() { return contact; }
public void setContact(String contact) { this.contact = contact; }
public String getContactQQ() { return contactQQ; }
public void setContactQQ(String contactQQ) { this.contactQQ = contactQQ; }
public String getContactWechat() { return contactWechat; }
public void setContactWechat(String contactWechat) { this.contactWechat = contactWechat; }
public long getPublishTime() { return publishTime; }
public void setPublishTime(long publishTime) { this.publishTime = publishTime; }
public String getUserId() { return userId; }
public void setUserId(String userId) { this.userId = userId; }
public int getViewCount() { return viewCount; }
public void setViewCount(int viewCount) { this.viewCount = viewCount; }
public int getLikeCount() { return likeCount; }
public void setLikeCount(int likeCount) { this.likeCount = likeCount; }
/**
*
*/
public void incrementViewCount() {
this.viewCount++;
}
/**
*
*/
public void incrementLikeCount() {
this.likeCount++;
}
@Override
public String toString() {
return "Item{" +
"id='" + id + '\'' +
", title='" + title + '\'' +
", price=" + price +
", category='" + category + '\'' +
", location='" + location + '\'' +
", publishTime=" + publishTime +
'}';
}
}

@ -0,0 +1,33 @@
package com.startsmake.llrisetabbardemo.model;
public class MessageItem {
private String title;
private String content;
private String time;
private int unreadCount;
private boolean isOfficial;
public MessageItem(String title, String content, String time, int unreadCount, boolean isOfficial) {
this.title = title;
this.content = content;
this.time = time;
this.unreadCount = unreadCount;
this.isOfficial = isOfficial;
}
// Getter and Setter methods
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public String getContent() { return content; }
public void setContent(String content) { this.content = content; }
public String getTime() { return time; }
public void setTime(String time) { this.time = time; }
public int getUnreadCount() { return unreadCount; }
public void setUnreadCount(int unreadCount) { this.unreadCount = unreadCount; }
public boolean isOfficial() { return isOfficial; }
public void setOfficial(boolean official) { isOfficial = official; }
}

@ -0,0 +1,69 @@
package com.startsmake.llrisetabbardemo.model;
import java.io.Serializable;
import java.util.Objects;
public class Product implements Serializable {
private String id;
private String name;
private String description;
private String category;
private double price;
private String imageUrl;
public Product() {
}
public Product(String id, String name, String description, String category, double price, String imageUrl) {
this.id = id;
this.name = name;
this.description = description;
this.category = category;
this.price = price;
this.imageUrl = imageUrl;
}
// Getter 和 Setter 方法
public String getId() { return id; }
public void setId(String id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getDescription() { return description; }
public void setDescription(String description) { this.description = description; }
public String getCategory() { return category; }
public void setCategory(String category) { this.category = category; }
public double getPrice() { return price; }
public void setPrice(double price) { this.price = price; }
public String getImageUrl() { return imageUrl; }
public void setImageUrl(String imageUrl) { this.imageUrl = imageUrl; }
// 添加 equals 和 hashCode 方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Product product = (Product) o;
return Objects.equals(id, product.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
// 可选:添加 toString 方法便于调试
@Override
public String toString() {
return "Product{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", category='" + category + '\'' +
", price=" + price +
'}';
}
}

@ -0,0 +1,27 @@
package com.startsmake.llrisetabbardemo.model;
public class User {
private String phone;
private String password;
private String username;
private long registerTime;
public User(String phone, String password) {
this.phone = phone;
this.password = password;
this.username = "用户_" + phone.substring(7);
this.registerTime = System.currentTimeMillis();
}
// Getters and Setters
public String getPhone() { return phone; }
public void setPhone(String phone) { this.phone = phone; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public long getRegisterTime() { return registerTime; }
}

@ -0,0 +1,171 @@
package manager;
import com.startsmake.llrisetabbardemo.model.Item;
import java.util.ArrayList;
import java.util.List;
/**
* - 使
*
*/
public class DataManager {
// 单例实例
private static DataManager instance;
// 商品列表
private List<Item> 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<Item> 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<Item> getItemsByCategory(String category) {
List<Item> result = new ArrayList<>();
for (Item item : itemList) {
if (item.getCategory().equals(category)) {
result.add(item);
}
}
return result;
}
/**
*
* @param keyword
* @return
*/
public List<Item> searchItems(String keyword) {
List<Item> 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();
}
}

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@android:color/white" />
<stroke
android:width="1dp"
android:color="#e0e0e0" />
<corners android:radius="4dp" />
</shape>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#20FFD700" />
<corners android:radius="8dp" />
</shape>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFD700" />
<corners android:radius="24dp" />
</shape>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#20FFD700" />
<corners android:radius="24dp" />
<stroke android:width="1dp" android:color="#FFD700" />
</shape>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#f5f5f5" />
<corners android:radius="24dp" />
<stroke
android:width="1dp"
android:color="#e0e0e0" />
</shape>

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@android:color/white" />
<corners
android:topLeftRadius="0dp"
android:topRightRadius="16dp"
android:bottomLeftRadius="16dp"
android:bottomRightRadius="16dp" />
<stroke
android:width="1dp"
android:color="#e0e0e0" />
</shape>

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#07C160" />
<corners
android:topLeftRadius="16dp"
android:topRightRadius="0dp"
android:bottomLeftRadius="16dp"
android:bottomRightRadius="16dp" />
</shape>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#99000000" />
<corners android:radius="12dp" />
</shape>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFFFFF" />
<stroke android:width="1dp" android:color="#E0E0E0" />
<corners android:radius="8dp" />
</shape>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#f0f0f0" />
<corners android:radius="4dp" />
<stroke
android:width="1dp"
android:color="#e0e0e0" />
</shape>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#f5f5f5" />
<corners android:radius="18dp" />
</shape>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FF5000" />
<corners android:radius="9dp" />
</shape>

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="#FFFFFFFF" />
<stroke
android:width="1dp"
android:color="#FFE0E0E0" />
<!-- 添加阴影效果 -->
<padding
android:left="2dp"
android:top="2dp"
android:right="2dp"
android:bottom="2dp" />
</shape>

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="12dp" />
<solid android:color="#FF00BCD4" />
<stroke
android:width="0.5dp"
android:color="#FF0097A7" />
<padding
android:left="8dp"
android:top="2dp"
android:right="8dp"
android:bottom="2dp" />
</shape>

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF666666"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2z M12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z"/>
<path
android:fillColor="#FF666666"
android:pathData="M12,6c-3.31,0 -6,2.69 -6,6s2.69,6 6,6 6,-2.69 6,-6 -2.69,-6 -6,-6z M12,16c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4 4,1.79 4,4 -1.79,4 -4,4z"/>
<path
android:fillColor="#FF666666"
android:pathData="M12,9.5c-1.38,0 -2.5,1.12 -2.5,2.5s1.12,2.5 2.5,2.5 2.5,-1.12 2.5,-2.5 -1.12,-2.5 -2.5,-2.5z"/>
</vector>

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="@color/white">
<path
android:fillColor="@android:color/white"
android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
</vector>

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#333333">
<path
android:fillColor="@android:color/white"
android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
</vector>

@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:strokeColor="#FF666666"
android:strokeWidth="2"
android:fillColor="@android:color/transparent"
android:pathData="M9,6l6,6l-6,6"/>
</vector>

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFE44D"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2z M12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z"/>
<path
android:fillColor="#FFE44D"
android:pathData="M12.5,7H11v6l5.25,3.15l0.75,-1.23l-4.5,-2.67z"/>
<path
android:fillColor="#FFE44D"
android:pathData="M7,12.5h10v-1H7z"/>
</vector>

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFE44D"
android:pathData="M20,6h-2.18c0.11,-0.31 0.18,-0.65 0.18,-1c0,-1.66 -1.34,-3 -3,-3c-1.05,0 -1.96,0.54 -2.5,1.35C12.96,2.54 12.05,2 11,2C9.34,2 8,3.34 8,5c0,0.35 0.07,0.69 0.18,1H4c-1.11,0 -1.99,0.89 -1.99,2L2,19c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2V8C22,6.89 21.11,6 20,6z M15,4c0.55,0 1,0.45 1,1s-0.45,1 -1,1s-1,-0.45 -1,-1S14.45,4 15,4z M11,4c0.55,0 1,0.45 1,1s-0.45,1 -1,1s-1,-0.45 -1,-1S10.45,4 11,4z M4,19v-6h6v6H4z M14,19v-6h6v6H14z"/>
</vector>

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF757575"
android:pathData="M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z"/>
</vector>

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF4CAF50"
android:pathData="M20,2H4C2.9,2 2,2.9 2,4v12c0,1.1 0.9,2 2,2h4v3c0,0.55 0.45,1 1,1h0.5c0.25,0 0.49,-0.09 0.67,-0.26L13.9,18H20c1.1,0 2,-0.9 2,-2V4C22,2.9 21.1,2 20,2z M20,16h-6.09c-0.18,0 -0.35,0.06 -0.49,0.17l-1.42,1.42V16H4V4h16V16z"/>
<path
android:fillColor="#FF4CAF50"
android:pathData="M11,11h2v2h-2z M11,7h2v2h-2z"/>
</vector>

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFE44D"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2z M12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z"/>
<path
android:fillColor="#FFE44D"
android:pathData="M11,16h2v2h-2z"/>
<path
android:fillColor="#FFE44D"
android:pathData="M12,6c-2.21,0 -4,1.79 -4,4h2c0,-1.1 0.9,-2 2,-2s2,0.9 2,2c0,2 -3,1.75 -3,5h2c0,-2.25 3,-2.5 3,-5C16,7.79 14.21,6 12,6z"/>
</vector>

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFE44D"
android:pathData="M16,11c1.66,0 2.99,-1.34 2.99,-3S17.66,5 16,5c-1.66,0 -3,1.34 -3,3S14.34,11 16,11z M8,11c1.66,0 2.99,-1.34 2.99,-3S9.66,5 8,5C6.34,5 5,6.34 5,8S6.34,11 8,11z M8,13c-2.33,0 -7,1.17 -7,3.5V19h14v-2.5C15,14.17 10.33,13 8,13z M16,13c-0.29,0 -0.62,0.02 -0.97,0.05c1.16,0.84 1.97,1.97 1.97,3.45V19h6v-2.5C23,14.17 18.33,13 16,13z"/>
<path
android:fillColor="#FFE44D"
android:pathData="M20,2H4C2.9,2 2,2.9 2,4v12c0,1.1 0.9,2 2,2h4v-2H4V4h16v12h-4v2h4c1.1,0 2,-0.9 2,-2V4C22,2.9 21.1,2 20,2z"/>
</vector>

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF666666"
android:pathData="M17,7l-1.41,1.41L18.17,11H8v2h10.17l-2.58,2.58L17,17l5,-5L17,7z M4,5h8V3H4C2.9,3 2,3.9 2,5v14c0,1.1 0.9,2 2,2h8v-2H4V5z"/>
</vector>

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF666666"
android:pathData="M6,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z M18,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z M12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z"/>
</vector>

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFE44D"
android:pathData="M19,3H5C3.9,3 3,3.9 3,5v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5C21,3.9 20.1,3 19,3zM19,19H5V5h14V19z"/>
<path
android:fillColor="#FFE44D"
android:pathData="M8.5,15H6.5l4,-7 4,7h-2l-1.5,-2.5L8.5,15z"/>
<path
android:fillColor="#FFE44D"
android:pathData="M17,12.5h-4V11h4V12.5z"/>
</vector>

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="12dp"
android:height="12dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF5000"
android:pathData="M12,2L4,5v6.09c0,5.05 3.41,9.76 8,10.91c4.59,-1.15 8,-5.86 8,-10.91V5L12,2z"/>
</vector>

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFE44D"
android:pathData="M12,22c1.1,0 2,-0.9 2,-2h-4C10,21.1 10.9,22 12,22z M18,16v-5c0,-3.07 -1.64,-5.64 -4.5,-6.32V4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.63,5.36 6,7.92 6,11v5l-2,2v1h16v-1L18,16z"/>
<path
android:fillColor="#FFE44D"
android:pathData="M15,9H9v2h1v3h4v-3h1V9z"/>
</vector>

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#BDBDBD"
android:pathData="M19,5v14H5V5h14m0-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z"/>
<path
android:fillColor="#BDBDBD"
android:pathData="M12,12c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM14,16v2h-4v-2c0,-1.1 0.9,-2 2,-2s2,0.9 2,2z"/>
</vector>

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFE44D"
android:pathData="M13,3c-4.97,0 -9,4.03 -9,9H1l3.89,3.89l0.07,0.14L9,12H6c0,-3.87 3.13,-7 7,-7s7,3.13 7,7s-3.13,7 -7,7c-1.93,0 -3.68,-0.79 -4.94,-2.06l-1.42,1.42C8.27,19.99 10.51,21 13,21c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9z"/>
<path
android:fillColor="#FFE44D"
android:pathData="M12,8v5l4.25,2.52l0.77,-1.28l-3.52,-2.09V8z"/>
</vector>

@ -0,0 +1,39 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF666666"
android:pathData="M3,11h8V3H3V11zM5,5h4v4H5V5z"/>
<path
android:fillColor="#FF666666"
android:pathData="M3,21h8v-8H3V21zM5,15h4v4H5V15z"/>
<path
android:fillColor="#FF666666"
android:pathData="M13,3v8h8V3H13zM19,9h-4V5h4V9z"/>
<path
android:fillColor="#FF666666"
android:pathData="M21,19h-2v2h2V19z"/>
<path
android:fillColor="#FF666666"
android:pathData="M13,13h2v2h-2V13z"/>
<path
android:fillColor="#FF666666"
android:pathData="M15,15h2v2h-2V15z"/>
<path
android:fillColor="#FF666666"
android:pathData="M13,17h2v2h-2V17z"/>
<path
android:fillColor="#FF666666"
android:pathData="M15,19h2v2h-2V19z"/>
<path
android:fillColor="#FF666666"
android:pathData="M17,17h2v2h-2V17z"/>
<path
android:fillColor="#FF666666"
android:pathData="M19,15h2v2h-2V15z"/>
<path
android:fillColor="#FF666666"
android:pathData="M17,13h2v2h-2V13z"/>
</vector>

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF666666"
android:pathData="M19.14,12.94c0.04,-0.3 0.06,-0.61 0.06,-0.94c0,-0.32 -0.02,-0.64 -0.07,-0.94l2.03,-1.58c0.18,-0.14 0.23,-0.41 0.12,-0.61l-1.92,-3.32c-0.12,-0.22 -0.37,-0.29 -0.59,-0.22l-2.39,0.96c-0.5,-0.38 -1.03,-0.7 -1.62,-0.94L14.4,2.81c-0.04,-0.24 -0.24,-0.41 -0.48,-0.41h-3.84c-0.24,0 -0.43,0.17 -0.47,0.41L9.25,5.35C8.66,5.59 8.12,5.92 7.63,6.29L5.24,5.33c-0.22,-0.08 -0.47,0 -0.59,0.22L2.74,8.87C2.62,9.08 2.66,9.34 2.86,9.48l2.03,1.58C4.84,11.36 4.82,11.69 4.82,12s0.02,0.64 0.07,0.94l-2.03,1.58c-0.18,0.14 -0.23,0.41 -0.12,0.61l1.92,3.32c0.12,0.22 0.37,0.29 0.59,0.22l2.39,-0.96c0.5,0.38 1.03,0.7 1.62,0.94l0.36,2.54c0.05,0.24 0.24,0.41 0.48,0.41h3.84c0.24,0 0.44,-0.17 0.47,-0.41l0.36,-2.54c0.59,-0.24 1.13,-0.56 1.62,-0.94l2.39,0.96c0.22,0.08 0.47,0 0.59,-0.22l1.92,-3.32c0.12,-0.22 0.07,-0.47 -0.12,-0.61L19.14,12.94zM12,15.6c-1.98,0 -3.6,-1.62 -3.6,-3.6s1.62,-3.6 3.6,-3.6s3.6,1.62 3.6,3.6S13.98,15.6 12,15.6z"/>
</vector>

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#2196F3"
android:pathData="M19,6h-2c0,-2.8 -2.2,-5 -5,-5S7,3.2 7,6H5C3.9,6 3,6.9 3,8v12c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V8C21,6.9 20.1,6 19,6z M12,3c1.7,0 3,1.3 3,3H9C9,4.3 10.3,3 12,3z M19,20H5V8h2v2c0,0.6 0.4,1 1,1s1,-0.4 1,-1V8h6v2c0,0.6 0.4,1 1,1s1,-0.4 1,-1V8h2V20z"/>
</vector>

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFE44D"
android:pathData="M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2L9.19,8.63L2,9.24l5.46,4.73L5.82,21z"/>
</vector>

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="12dp" />
<!-- 银白色渐变 -->
<gradient
android:type="linear"
android:startColor="#FFE8E8E8"
android:centerColor="#FFD6D6D6"
android:endColor="#FFC0C0C0"
android:angle="45" />
<stroke
android:width="0.8dp"
android:color="#FFA0A0A0" />
<padding
android:left="8dp"
android:top="2dp"
android:right="8dp"
android:bottom="2dp" />
</shape>

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 设置圆角半径 -->
<corners android:radius="20dp" />
<!-- 背景颜色 -->
<solid android:color="@android:color/white" />
</shape>

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="25dp" />
<!-- 渐变背景 -->
<gradient
android:type="linear"
android:startColor="#FFFFFF"
android:endColor="#F8F9FA"
android:angle="90" />
<stroke
android:width="1dp"
android:color="#E0E0E0" />
</shape>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@android:color/transparent" />
<stroke
android:width="0.8dp"
android:color="#999999" />
<corners android:radius="18dp" />
</shape>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#f5f5f5" />
<corners android:radius="20dp" />
<stroke
android:width="1dp"
android:color="#e0e0e0" />
</shape>

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 圆角 -->
<corners android:radius="16dp" />
<!-- 背景色 - 白色 -->
<solid android:color="@color/white" />
<!-- 灰色边框 -->
<stroke
android:width="1dp"
android:color="@color/gray_300" />
<!-- 内边距 -->
<padding
android:left="8dp"
android:top="4dp"
android:right="8dp"
android:bottom="4dp" />
</shape>

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="16dp" />
<!-- 渐变背景 -->
<gradient
android:type="linear"
android:startColor="@color/primary_blue_light"
android:endColor="@color/primary_blue"
android:angle="90" />
<stroke
android:width="1dp"
android:color="@color/primary_blue_dark" />
</shape>

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#f5f5f5">
<!-- 标题栏 -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@android:color/white"
android:elevation="2dp">
<ImageView
android:id="@+id/ivBack"
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@android:drawable/ic_menu_close_clear_cancel"
android:layout_centerVertical="true"
android:layout_marginStart="16dp" />
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="聊天"
android:textSize="18sp"
android:textStyle="bold"
android:layout_centerInParent="true" />
</RelativeLayout>
<!-- 聊天消息列表 -->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvChatMessages"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<!-- 输入框区域 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:orientation="horizontal"
android:padding="8dp"
android:elevation="4dp">
<EditText
android:id="@+id/etMessage"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/bg_chat_input"
android:hint="输入消息..."
android:maxLines="3"
android:padding="12dp"
android:textSize="14sp" />
<ImageButton
android:id="@+id/btnSend"
android:layout_width="48dp"
android:layout_height="48dp"
android:background="?android:attr/selectableItemBackground"
android:src="@android:drawable/ic_menu_send"
android:layout_marginStart="8dp" />
</LinearLayout>
</LinearLayout>

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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="match_parent"
android:background="#FFFFFF"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="32dp">
<!-- 返回按钮 -->
<ImageButton
android:id="@+id/btn_back"
android:layout_width="48dp"
android:layout_height="48dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:src="@drawable/ic_arrow_back"
android:tint="#333333" />
<!-- 标题 -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:layout_marginBottom="40dp"
android:text="忘记密码"
android:textColor="#333333"
android:textSize="24sp"
android:textStyle="bold" />
<!-- 手机号输入框 -->
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
app:boxCornerRadiusBottomEnd="12dp"
app:boxCornerRadiusBottomStart="12dp"
app:boxCornerRadiusTopEnd="12dp"
app:boxCornerRadiusTopStart="12dp"
app:boxStrokeColor="#FFD700"
app:hintTextColor="#999999">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/et_phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="手机号"
android:inputType="phone"
android:maxLines="1"
android:padding="16dp"
android:textColor="#333333"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
<!-- 验证码输入框 -->
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
app:boxCornerRadiusBottomEnd="12dp"
app:boxCornerRadiusBottomStart="12dp"
app:boxCornerRadiusTopEnd="12dp"
app:boxCornerRadiusTopStart="12dp"
app:boxStrokeColor="#FFD700"
app:hintTextColor="#999999">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/et_verification_code"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="验证码"
android:inputType="number"
android:maxLines="1"
android:padding="16dp"
android:textColor="#333333"
android:textSize="16sp" />
<Button
android:id="@+id/btn_send_code"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:background="@drawable/bg_button_code"
android:text="发送验证码"
android:textColor="#FFD700"
android:textSize="12sp" />
</LinearLayout>
</com.google.android.material.textfield.TextInputLayout>
<!-- 新密码输入框 -->
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="32dp"
app:boxCornerRadiusBottomEnd="12dp"
app:boxCornerRadiusBottomStart="12dp"
app:boxCornerRadiusTopEnd="12dp"
app:boxCornerRadiusTopStart="12dp"
app:boxStrokeColor="#FFD700"
app:hintTextColor="#999999">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/et_new_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="设置新密码"
android:inputType="textPassword"
android:maxLines="1"
android:padding="16dp"
android:textColor="#333333"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
<!-- 重置密码按钮 -->
<Button
android:id="@+id/btn_reset_password"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="@drawable/bg_button_primary"
android:text="重置密码"
android:textColor="#333333"
android:textSize="16sp"
android:textStyle="bold" />
<!-- 底部链接 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="想起密码?"
android:textColor="#666666"
android:textSize="14sp" />
<TextView
android:id="@+id/tv_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="返回登录"
android:textColor="#FFD700"
android:textSize="14sp"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>
</ScrollView>

@ -0,0 +1,145 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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="match_parent"
android:background="#FFFFFF"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="32dp">
<!-- Logo -->
<ImageView
android:layout_width="120dp"
android:layout_height="120dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="60dp"
android:layout_marginBottom="40dp"
android:src="@mipmap/ic_launcher"
android:tint="#FFD700" />
<!-- 标题 -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="40dp"
android:text="BudgetFindly"
android:textColor="#333333"
android:textSize="24sp"
android:textStyle="bold" />
<!-- 手机号输入框 -->
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
app:boxCornerRadiusBottomEnd="12dp"
app:boxCornerRadiusBottomStart="12dp"
app:boxCornerRadiusTopEnd="12dp"
app:boxCornerRadiusTopStart="12dp"
app:boxStrokeColor="#FFD700"
app:hintTextColor="#999999">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/et_phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="手机号"
android:inputType="phone"
android:maxLines="1"
android:padding="16dp"
android:textColor="#333333"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
<!-- 密码输入框 -->
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="32dp"
app:boxCornerRadiusBottomEnd="12dp"
app:boxCornerRadiusBottomStart="12dp"
app:boxCornerRadiusTopEnd="12dp"
app:boxCornerRadiusTopStart="12dp"
app:boxStrokeColor="#FFD700"
app:hintTextColor="#999999">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="密码"
android:inputType="textPassword"
android:maxLines="1"
android:padding="16dp"
android:textColor="#333333"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
<!-- 登录按钮 -->
<Button
android:id="@+id/btn_login"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="@drawable/bg_button_primary"
android:text="登录"
android:textColor="#333333"
android:textSize="16sp"
android:textStyle="bold" />
<!-- 跳过登录按钮 -->
<Button
android:id="@+id/btn_skip_login"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginTop="12dp"
android:background="@drawable/bg_button_secondary"
android:text="跳过登录"
android:textColor="#FFD700"
android:textSize="16sp" />
<!-- 底部链接 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_forgot_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="忘记密码?"
android:textColor="#FFD700"
android:textSize="14sp"
android:textStyle="bold" />
<View
android:layout_width="1dp"
android:layout_height="12dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:background="#DDDDDD" />
<TextView
android:id="@+id/tv_register"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="立即注册"
android:textColor="#FFD700"
android:textSize="14sp"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>
</ScrollView>

@ -5,43 +5,30 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Fragment 容器 -->
<FrameLayout
android:id="@+id/main_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/mainTabBar"/>
<!-- 底部导航栏 -->
<com.startsmake.mainnavigatetabbar.widget.MainNavigateTabBar
android:id="@+id/mainTabBar"
android:layout_width="match_parent"
android:layout_height="50.0dip"
android:layout_height="56dp"
android:layout_alignParentBottom="true"
android:background="@android:color/white"
app:containerId="@+id/main_container"
app:navigateTabSelectedTextColor="@color/comui_tab_text_color"
app:navigateTabTextColor="@color/comui_tab_text_color"/>
app:navigateTabSelectedTextColor="#FFD700"
app:navigateTabTextColor="#666666"/>
<!-- 顶部阴影(可选) -->
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="3dp"
android:layout_above="@+id/mainTabBar"
android:background="@mipmap/comui_bar_top_shadow"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="76.0dip"
android:layout_alignParentBottom="true"
android:background="@android:color/transparent"
android:gravity="center|top"
android:orientation="vertical">
android:src="@mipmap/comui_bar_top_shadow"
android:scaleType="fitXY"/>
<ImageView
android:id="@+id/tab_post_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClickPublish"
android:src="@mipmap/comui_tab_post"/>
</LinearLayout>
</RelativeLayout>
</RelativeLayout>

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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="match_parent"
android:background="#FFFFFF"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="32dp">
<!-- 返回按钮 -->
<ImageButton
android:id="@+id/btn_back"
android:layout_width="48dp"
android:layout_height="48dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:src="@drawable/ic_arrow_back"
android:tint="#333333" />
<!-- 标题 -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:layout_marginBottom="40dp"
android:text="注册账号"
android:textColor="#333333"
android:textSize="24sp"
android:textStyle="bold" />
<!-- 手机号输入框 -->
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
app:boxCornerRadiusBottomEnd="12dp"
app:boxCornerRadiusBottomStart="12dp"
app:boxCornerRadiusTopEnd="12dp"
app:boxCornerRadiusTopStart="12dp"
app:boxStrokeColor="#FFD700"
app:hintTextColor="#999999">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/et_phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="手机号"
android:inputType="phone"
android:maxLines="1"
android:padding="16dp"
android:textColor="#333333"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
<!-- 验证码输入框 -->
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
app:boxCornerRadiusBottomEnd="12dp"
app:boxCornerRadiusBottomStart="12dp"
app:boxCornerRadiusTopEnd="12dp"
app:boxCornerRadiusTopStart="12dp"
app:boxStrokeColor="#FFD700"
app:hintTextColor="#999999">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/et_verification_code"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="验证码"
android:inputType="number"
android:maxLines="1"
android:padding="16dp"
android:textColor="#333333"
android:textSize="16sp" />
<Button
android:id="@+id/btn_send_code"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="8dp"
android:background="@drawable/bg_button_code"
android:text="发送验证码"
android:textColor="#FFD700"
android:textSize="12sp" />
</LinearLayout>
</com.google.android.material.textfield.TextInputLayout>
<!-- 密码输入框 -->
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="32dp"
app:boxCornerRadiusBottomEnd="12dp"
app:boxCornerRadiusBottomStart="12dp"
app:boxCornerRadiusTopEnd="12dp"
app:boxCornerRadiusTopStart="12dp"
app:boxStrokeColor="#FFD700"
app:hintTextColor="#999999">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="设置密码"
android:inputType="textPassword"
android:maxLines="1"
android:padding="16dp"
android:textColor="#333333"
android:textSize="16sp" />
</com.google.android.material.textfield.TextInputLayout>
<!-- 注册按钮 -->
<Button
android:id="@+id/btn_register"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="@drawable/bg_button_primary"
android:text="注册"
android:textColor="#333333"
android:textSize="16sp"
android:textStyle="bold" />
<!-- 底部链接 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="已有账号?"
android:textColor="#666666"
android:textSize="14sp" />
<TextView
android:id="@+id/tv_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="立即登录"
android:textColor="#FFD700"
android:textSize="14sp"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>
</ScrollView>

@ -0,0 +1,176 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="match_parent"
android:orientation="vertical"
android:background="@android:color/white">
<!-- 搜索栏 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FFDD59"
android:orientation="horizontal"
android:padding="12dp">
<!-- 返回按钮 -->
<ImageButton
android:id="@+id/back_button"
android:layout_width="24dp"
android:layout_height="50dp"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:src="@drawable/ic_back"
android:scaleType="centerInside"
android:padding="6dp"
android:contentDescription="返回" />
<!-- 搜索框 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:alpha="0.8"
android:background="@drawable/rounded_background1"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="8dp">
<!-- 摄像头按钮 -->
<ImageButton
android:id="@+id/camera_button"
android:layout_width="23dp"
android:layout_height="24dp"
android:layout_marginStart="4dp"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:padding="0.5dp"
android:scaleType="centerInside"
android:src="@android:drawable/ic_menu_camera"
android:contentDescription="拍照搜索" />
<EditText
android:id="@+id/search_edit_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginStart="8dp"
android:background="@null"
android:hint="搜索教材、数码、生活用品..."
android:imeOptions="actionSearch"
android:inputType="text"
android:maxLines="1"
android:singleLine="true"
android:textColor="#333333"
android:textColorHint="#999999"
android:textSize="14sp"
android:cursorVisible="true"
android:focusable="true"
android:focusableInTouchMode="true"/>
<!-- 搜索按钮 - 放在输入框外面右侧 -->
<TextView
android:id="@+id/search_button"
android:layout_width="50dp"
android:layout_height="27dp"
android:layout_marginStart="2dp"
android:layout_marginTop="0dp"
android:gravity="center"
android:text="搜索"
android:textColor="#333333"
android:textSize="14sp"
android:textStyle="bold"
android:clickable="true"
android:focusable="true" />
</LinearLayout>
</LinearLayout>
<!-- 内容区域 -->
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<!-- 历史搜索 -->
<TextView
android:id="@+id/history_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="历史搜索"
android:textColor="#333333"
android:textSize="16sp"
android:textStyle="bold"
android:layout_marginBottom="12dp" />
<!-- 历史记录容器 - 使用 FlexboxLayout -->
<com.google.android.flexbox.FlexboxLayout
android:id="@+id/history_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:flexWrap="wrap"
app:alignItems="flex_start"
app:justifyContent="flex_start" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical">
<!-- 展开/收起按钮 -->
<TextView
android:id="@+id/expand_history_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="展开更多"
android:textColor="#666666"
android:textSize="12sp"
android:padding="8dp"
android:visibility="gone" />
<!-- 清空历史 -->
<TextView
android:id="@+id/clear_history_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清空历史记录"
android:textColor="#666666"
android:textSize="12sp"
android:padding="8dp" />
</LinearLayout>
<!-- 猜你可能在找 -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="猜你可能在找"
android:textColor="#333333"
android:textSize="16sp"
android:textStyle="bold"
android:layout_marginTop="24dp"
android:layout_marginBottom="12dp" />
<!-- 推荐容器 - 使用 FlexboxLayout -->
<com.google.android.flexbox.FlexboxLayout
android:id="@+id/recommend_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:flexWrap="wrap"
app:alignItems="flex_start"
app:justifyContent="flex_start" />
</LinearLayout>
</ScrollView>
</LinearLayout>

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@android:color/white">
<!-- 搜索栏 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FFDD59"
android:orientation="horizontal"
android:padding="16dp">
<ImageButton
android:id="@+id/back_button"
android:layout_width="20dp"
android:layout_height="28dp"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:src="@drawable/ic_back"
android:scaleType="centerInside"
android:padding="6dp"
android:contentDescription="返回" />
<TextView
android:id="@+id/search_query_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginStart="16dp"
android:gravity="center_vertical"
android:text="搜索结果"
android:textColor="#333333"
android:textSize="16sp"
android:textStyle="bold" />
</LinearLayout>
<!-- 搜索结果 -->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/results_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp" />
<!-- 无结果提示 -->
<TextView
android:id="@+id/no_results_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="120dp"
android:text="没有找到相关商品"
android:textColor="#666666"
android:textSize="16sp"
android:visibility="gone" />
</LinearLayout>

@ -1,14 +1,325 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:orientation="vertical"
android:background="#f5f5f5">
<TextView
<!-- 顶部搜索栏 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal"
android:background="#FFFFFF"
android:padding="8dp">
<EditText
android:id="@+id/et_search"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:hint="搜索民航大学闲置物品"
android:background="@drawable/search_background"
android:paddingStart="12dp"
android:paddingEnd="12dp"
android:singleLine="true"
android:textSize="14sp"/>
<Button
android:id="@+id/btn_filter"
android:layout_width="60dp"
android:layout_height="match_parent"
android:text="筛选"
android:textSize="12sp"
android:layout_marginStart="8dp"
android:background="@color/primary_blue"/>
</LinearLayout>
<!-- 校区选择标签 -->
<HorizontalScrollView
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#FFFFFF"
android:paddingVertical="4dp">
<LinearLayout
android:id="@+id/tag_container"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal">
<Button
android:id="@+id/tag_all"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="全部"
android:textSize="12sp"
android:background="@drawable/tag_selected_background"
android:layout_marginHorizontal="4dp"/>
<Button
android:id="@+id/tag_south"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="南区"
android:textSize="12sp"
android:background="@drawable/tag_normal_background"
android:layout_marginHorizontal="4dp"/>
<Button
android:id="@+id/tag_north"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="北区"
android:textSize="12sp"
android:background="@drawable/tag_normal_background"
android:layout_marginHorizontal="4dp"/>
<Button
android:id="@+id/tag_textbook"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="教材专区"
android:textSize="12sp"
android:background="@drawable/tag_normal_background"
android:layout_marginHorizontal="4dp"/>
<Button
android:id="@+id/tag_digital"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="数码电子"
android:textSize="12sp"
android:background="@drawable/tag_normal_background"
android:layout_marginHorizontal="4dp"/>
</LinearLayout>
</HorizontalScrollView>
<!-- 店铺样例 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="#FFFFFF"
android:layout_margin="8dp"
android:padding="12dp"
android:elevation="2dp">
<!-- 店铺头部信息 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical">
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/ic_store"
android:background="#e3f2fd"
android:padding="8dp"
android:layout_marginEnd="12dp"/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="王泽的店铺"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="#333333"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="学号230340187"
android:textSize="12sp"
android:textColor="#666666"
android:layout_marginTop="2dp"/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="信用良好"
android:textSize="10sp"
android:background="#4caf50"
android:textColor="#FFFFFF"
android:paddingHorizontal="8dp"
android:paddingVertical="2dp"
android:gravity="center"/>
</LinearLayout>
<!-- 店铺商品预览 -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="在售商品:"
android:textSize="14sp"
android:textColor="#333333"
android:layout_marginTop="12dp"
android:layout_marginBottom="8dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="3">
<!-- 商品1 -->
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:background="#f8f9fa"
android:padding="8dp"
android:layout_marginEnd="4dp">
<ImageView
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="#e0e0e0"
android:scaleType="centerCrop"
android:src="@drawable/ic_product_placeholder"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="二手教材"
android:textSize="12sp"
android:textColor="#333333"
android:maxLines="1"
android:ellipsize="end"
android:layout_marginTop="4dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="¥25"
android:textSize="14sp"
android:textColor="#e53935"
android:textStyle="bold"
android:layout_marginTop="2dp"/>
</LinearLayout>
<!-- 商品2 -->
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:background="#f8f9fa"
android:padding="8dp"
android:layout_marginHorizontal="4dp">
<ImageView
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="#e0e0e0"
android:scaleType="centerCrop"
android:src="@drawable/ic_product_placeholder"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="蓝牙耳机"
android:textSize="12sp"
android:textColor="#333333"
android:maxLines="1"
android:ellipsize="end"
android:layout_marginTop="4dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="¥120"
android:textSize="14sp"
android:textColor="#e53935"
android:textStyle="bold"
android:layout_marginTop="2dp"/>
</LinearLayout>
<!-- 商品3 -->
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:background="#f8f9fa"
android:padding="8dp"
android:layout_marginStart="4dp">
<ImageView
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="#e0e0e0"
android:scaleType="centerCrop"
android:src="@drawable/ic_product_placeholder"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="运动水杯"
android:textSize="12sp"
android:textColor="#333333"
android:maxLines="1"
android:ellipsize="end"
android:layout_marginTop="4dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="¥15"
android:textSize="14sp"
android:textColor="#e53935"
android:textStyle="bold"
android:layout_marginTop="2dp"/>
</LinearLayout>
</LinearLayout>
<!-- 查看店铺按钮 -->
<Button
android:layout_width="match_parent"
android:layout_height="36dp"
android:text="进入店铺"
android:textSize="14sp"
android:background="#2196f3"
android:textColor="#FFFFFF"
android:layout_marginTop="12dp"/>
</LinearLayout>
<!-- 商品列表 -->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_products"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:padding="8dp"/>
<!-- 底部发布按钮 -->
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab_publish"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="同城"/>
android:layout_gravity="end|bottom"
android:layout_margin="16dp"
android:src="@drawable/ic_add"
android:contentDescription="发布闲置"/>
</FrameLayout>
</LinearLayout>

@ -1,14 +1,244 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<FrameLayout 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="match_parent"
android:background="#fffaf0"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
<!-- 顶部搜索栏区域 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="首页"/>
android:background="#FFDD59"
android:orientation="vertical"
android:padding="10dp">
<!-- 搜索框 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2.5dp"
android:alpha="0.8"
android:background="@drawable/rounded_background1"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="8dp">
<!-- 搜索图标 -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:alpha="1"
android:text="🔍"
android:textSize="16sp" />
<!-- 搜索输入框 -->
<EditText
android:id="@+id/search_edit_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:alpha="1"
android:background="@null"
android:focusable="false"
android:focusableInTouchMode="false"
android:hint="搜索教材、数码、生活用品..."
android:inputType="none"
android:maxLines="1"
android:paddingStart="8dp"
android:paddingEnd="8dp"
android:singleLine="true"
android:textColor="#333333"
android:textColorHint="#999999"
android:textSize="14sp" />
<!-- 摄像头按钮 -->
<ImageButton
android:id="@+id/camera_button"
android:layout_width="23dp"
android:layout_height="24dp"
android:layout_marginStart="4dp"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:padding="0.5dp"
android:scaleType="centerInside"
android:src="@android:drawable/ic_menu_camera"
android:contentDescription="拍照搜索" />
<!-- 搜索按钮 - 放在输入框外面右侧 -->
<TextView
android:id="@+id/home_search_button"
android:layout_width="50dp"
android:layout_height="27dp"
android:layout_marginStart="2dp"
android:layout_marginTop="0dp"
android:gravity="center"
android:text="搜索"
android:textColor="#333333"
android:textSize="14sp"
android:textStyle="bold"
android:clickable="true"
android:focusable="true" />
</LinearLayout>
</LinearLayout>
<!-- 导航标签区域 -->
<HorizontalScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="65dp"
android:background="@android:color/white"
android:paddingVertical="8dp">
<LinearLayout
android:id="@+id/tab_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<!-- 关注标签 -->
<RadioButton
android:id="@+id/tab_follow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:text="关注"
android:button="@null"
android:textColor="#ff6b35"
android:textSize="14sp"
android:textStyle="bold"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true" />
<!-- 推荐标签 -->
<TextView
android:id="@+id/tab_recommend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:text="推荐"
android:textColor="#666666"
android:textSize="14sp"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true" />
<!-- 新发布标签 -->
<TextView
android:id="@+id/tab_new"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:text="新发布"
android:textColor="#666666"
android:textSize="14sp"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true" />
<!-- 学习资料标签 -->
<TextView
android:id="@+id/tab_study"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:text="学习资料"
android:textColor="#666666"
android:textSize="14sp"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true" />
<!-- 生活用品标签 -->
<TextView
android:id="@+id/tab_living"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:text="生活用品"
android:textColor="#666666"
android:textSize="14sp"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true" />
</LinearLayout>
</HorizontalScrollView>
<!-- 在导航标签区域后面添加商品展示区域 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical">
<!-- 商品展示区域 -->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/home_products_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />
<!-- 暂无商品提示 -->
<TextView
android:id="@+id/home_no_products_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="暂无商品"
android:textColor="#666666"
android:textSize="16sp"
android:visibility="gone" />
</LinearLayout>
<!-- 搜索结果RecyclerView -->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/search_results_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />
<!-- 无结果提示 -->
<TextView
android:id="@+id/no_results_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:text="没有找到相关商品"
android:textSize="16sp"
android:textColor="#666666"
android:visibility="gone" />
<!-- 首页默认内容区域 -->
<LinearLayout
android:id="@+id/default_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:padding="16dp">
</LinearLayout>
</FrameLayout>

@ -0,0 +1,142 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
android:background="#f5f5f5">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<!-- 商品图片 -->
<ImageView
android:id="@+id/ivItemImage"
android:layout_width="match_parent"
android:layout_height="200dp"
android:scaleType="centerCrop"
android:background="@drawable/bg_image_border"
android:src="@mipmap/ic_launcher" />
<!-- 商品基本信息 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@android:color/white"
android:padding="16dp"
android:layout_marginTop="8dp">
<TextView
android:id="@+id/tvTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="商品标题"
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tvPrice"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="¥0.00"
android:textColor="#ff4444"
android:textSize="20sp"
android:textStyle="bold"
android:layout_marginTop="8dp" />
</LinearLayout>
<!-- 商品详情 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@android:color/white"
android:padding="16dp"
android:layout_marginTop="8dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="商品详情"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tvDescription"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="商品描述"
android:textSize="14sp"
android:layout_marginTop="8dp"
android:lineSpacingExtra="4dp" />
</LinearLayout>
<!-- 商品信息 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@android:color/white"
android:padding="16dp"
android:layout_marginTop="8dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="商品信息"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tvCategory"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="分类:"
android:textSize="14sp"
android:layout_marginTop="8dp" />
<TextView
android:id="@+id/tvLocation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="位置:"
android:textSize="14sp"
android:layout_marginTop="4dp" />
<TextView
android:id="@+id/tvContact"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="联系方式:"
android:textSize="14sp"
android:layout_marginTop="4dp" />
<TextView
android:id="@+id/tvPublishTime"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="发布时间:"
android:textSize="14sp"
android:layout_marginTop="4dp" />
</LinearLayout>
<!-- 联系卖家按钮 -->
<Button
android:id="@+id/btnContact"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="联系卖家"
android:textSize="16sp"
android:textStyle="bold"
android:background="@drawable/bg_button_primary"
android:textColor="@android:color/white"
android:layout_marginTop="16dp" />
</LinearLayout>
</ScrollView>

@ -1,14 +1,60 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:orientation="vertical"
android:background="#f5f5f5">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="消息"/>
<!-- 标题栏 -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@android:color/white"
android:elevation="2dp">
</FrameLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="消息"
android:textSize="18sp"
android:textStyle="bold"
android:layout_centerInParent="true" />
</RelativeLayout>
<!-- 搜索栏 -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@android:color/white"
android:paddingHorizontal="16dp"
android:layout_marginTop="8dp">
<EditText
android:id="@+id/etSearch"
android:layout_width="match_parent"
android:layout_height="36dp"
android:background="@drawable/bg_search_edittext"
android:hint="搜索聊天记录/联系人/服务号"
android:paddingStart="40dp"
android:paddingEnd="16dp"
android:singleLine="true"
android:textSize="14sp" />
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@android:drawable/ic_menu_search"
android:layout_centerVertical="true"
android:layout_marginStart="12dp" />
</RelativeLayout>
<!-- 消息列表 -->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvMessageList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="8dp" />
</LinearLayout>

@ -1,14 +1,629 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:background="#f5f5f5">
<TextView
android:layout_width="wrap_content"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="我的"/>
android:orientation="vertical">
</FrameLayout>
<!-- 顶部用户信息区域 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="120dp"
android:background="@color/white"
android:orientation="horizontal"
android:padding="16dp">
<ImageView
android:id="@+id/iv_avatar"
android:layout_width="60dp"
android:layout_height="60dp"
android:src="@drawable/ic_default_avatar"
android:background="@drawable/circle_bg"
android:layout_marginEnd="16dp" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center_vertical">
<TextView
android:id="@+id/tv_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击登录"
android:clickable="true"
android:focusable="true"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="@color/black" />
<TextView
android:id="@+id/tv_user_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="省钱达人,精明购物"
android:textSize="12sp"
android:textColor="@color/gray"
android:layout_marginTop="4dp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="8dp">
<TextView
android:id="@+id/tv_credit_score"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="信用极好"
android:textSize="10sp"
android:background="@drawable/credit_bg"
android:paddingHorizontal="8dp"
android:paddingVertical="2dp"
android:textColor="@color/white" />
<TextView
android:id="@+id/tv_member_level"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="省钱会员"
android:textSize="10sp"
android:background="@drawable/member_bg"
android:paddingHorizontal="8dp"
android:paddingVertical="2dp"
android:textColor="@color/white"
android:layout_marginStart="8dp" />
</LinearLayout>
</LinearLayout>
<ImageView
android:id="@+id/iv_qr_code"
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/ic_qr_code"
android:layout_marginEnd="16dp" />
<ImageView
android:id="@+id/iv_settings"
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/ic_settings" />
</LinearLayout>
<!-- 数据统计区域 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="@color/white"
android:orientation="horizontal"
android:layout_marginTop="8dp"
android:padding="16dp">
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/tv_want_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="@color/black" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="想买"
android:textSize="12sp"
android:textColor="@color/gray"
android:layout_marginTop="4dp" />
</LinearLayout>
<View
android:layout_width="1dp"
android:layout_height="30dp"
android:background="#eeeeee"
android:layout_gravity="center" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/tv_selling_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="@color/black" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="在售"
android:textSize="12sp"
android:textColor="@color/gray"
android:layout_marginTop="4dp" />
</LinearLayout>
<View
android:layout_width="1dp"
android:layout_height="30dp"
android:background="#eeeeee"
android:layout_gravity="center" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/tv_sold_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="@color/black" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="已售"
android:textSize="12sp"
android:textColor="@color/gray"
android:layout_marginTop="4dp" />
</LinearLayout>
<View
android:layout_width="1dp"
android:layout_height="30dp"
android:background="#eeeeee"
android:layout_gravity="center" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/tv_saved_money"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="¥0"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="@color/green" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="已省钱"
android:textSize="12sp"
android:textColor="@color/gray"
android:layout_marginTop="4dp" />
</LinearLayout>
</LinearLayout>
<!-- 我的工具区域 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical"
android:layout_marginTop="8dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="我的工具"
android:textSize="14sp"
android:textColor="@color/black"
android:padding="16dp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingBottom="16dp">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<ImageView
android:layout_width="32dp"
android:layout_height="32dp"
android:src="@drawable/ic_my_listings"
android:layout_marginBottom="8dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我发布的"
android:textSize="12sp"
android:textColor="@color/gray" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<ImageView
android:layout_width="32dp"
android:layout_height="32dp"
android:src="@drawable/ic_purchase_history"
android:layout_marginBottom="8dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="购买记录"
android:textSize="12sp"
android:textColor="@color/gray" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<ImageView
android:layout_width="32dp"
android:layout_height="32dp"
android:src="@drawable/ic_wishlist"
android:layout_marginBottom="8dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="心愿单"
android:textSize="12sp"
android:textColor="@color/gray" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<ImageView
android:layout_width="32dp"
android:layout_height="32dp"
android:src="@drawable/ic_budget_tracker"
android:layout_marginBottom="8dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="预算追踪"
android:textSize="12sp"
android:textColor="@color/gray" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingBottom="16dp">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<ImageView
android:layout_width="32dp"
android:layout_height="32dp"
android:src="@drawable/ic_price_alert"
android:layout_marginBottom="8dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="价格提醒"
android:textSize="12sp"
android:textColor="@color/gray" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<ImageView
android:layout_width="32dp"
android:layout_height="32dp"
android:src="@drawable/ic_coupons"
android:layout_marginBottom="8dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="优惠券"
android:textSize="12sp"
android:textColor="@color/gray" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<ImageView
android:layout_width="32dp"
android:layout_height="32dp"
android:src="@drawable/ic_help"
android:layout_marginBottom="8dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="帮助中心"
android:textSize="12sp"
android:textColor="@color/gray" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<ImageView
android:layout_width="32dp"
android:layout_height="32dp"
android:src="@drawable/ic_more"
android:layout_marginBottom="8dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="更多"
android:textSize="12sp"
android:textColor="@color/gray" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<!-- 推荐功能区 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical"
android:layout_marginTop="8dp"
android:layout_marginBottom="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="推荐功能"
android:textSize="14sp"
android:textColor="@color/black"
android:padding="16dp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#eeeeee" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="56dp"
android:orientation="horizontal"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:gravity="center_vertical">
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/ic_invite_friends"
android:layout_marginEnd="12dp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="邀请好友"
android:textSize="14sp"
android:textColor="@color/black" />
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:src="@drawable/ic_arrow_right" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#eeeeee" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="56dp"
android:orientation="horizontal"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:gravity="center_vertical">
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/ic_feedback"
android:layout_marginEnd="12dp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="意见反馈"
android:textSize="14sp"
android:textColor="@color/black" />
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:src="@drawable/ic_arrow_right" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#eeeeee" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="56dp"
android:orientation="horizontal"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:gravity="center_vertical">
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/ic_about"
android:layout_marginEnd="12dp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="关于BudgetFindly"
android:textSize="14sp"
android:textColor="@color/black" />
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:src="@drawable/ic_arrow_right" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical"
android:layout_marginTop="8dp"
android:layout_marginBottom="16dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#eeeeee" />
<LinearLayout
android:id="@+id/ll_logout"
android:layout_width="match_parent"
android:layout_height="56dp"
android:orientation="horizontal"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:gravity="center_vertical"
android:background="?android:attr/selectableItemBackground">
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/ic_logout"
android:layout_marginEnd="12dp"
android:color="#FF5722" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="退出登录"
android:textSize="14sp"
android:textColor="#FF5722" />
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:src="@drawable/ic_arrow_right"
android:color="#FF5722" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</ScrollView>

@ -0,0 +1,148 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
android:background="#f5f5f5">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<!-- 图片上传区域 -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="上传图片"
android:textSize="16sp"
android:textStyle="bold"
android:layout_marginBottom="8dp" />
<GridView
android:id="@+id/gridViewImages"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:numColumns="3"
android:verticalSpacing="8dp"
android:horizontalSpacing="8dp"
android:stretchMode="columnWidth"
android:background="@drawable/bg_edittext"
android:padding="8dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="最多可上传9张图片"
android:textSize="12sp"
android:textColor="#666"
android:layout_marginTop="4dp"
android:layout_marginBottom="16dp" />
<!-- 商品信息区域 -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="商品信息"
android:textSize="16sp"
android:textStyle="bold"
android:layout_marginBottom="8dp" />
<EditText
android:id="@+id/etTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="商品标题"
android:maxLines="1"
android:background="@drawable/bg_edittext"
android:padding="12dp" />
<EditText
android:id="@+id/etDescription"
android:layout_width="match_parent"
android:layout_height="120dp"
android:hint="商品描述"
android:gravity="top"
android:maxLines="5"
android:background="@drawable/bg_edittext"
android:padding="12dp"
android:layout_marginTop="8dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="8dp">
<EditText
android:id="@+id/etPrice"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="价格"
android:inputType="numberDecimal"
android:background="@drawable/bg_edittext"
android:padding="12dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="元"
android:textSize="14sp"
android:gravity="center_vertical"
android:paddingStart="8dp"
android:paddingEnd="8dp" />
</LinearLayout>
<!-- 分类和位置 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="8dp">
<Spinner
android:id="@+id/spinnerCategory"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/bg_edittext"
android:padding="8dp" />
<Spinner
android:id="@+id/spinnerLocation"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginStart="8dp"
android:background="@drawable/bg_edittext"
android:padding="8dp" />
</LinearLayout>
<!-- 联系方式 -->
<EditText
android:id="@+id/etContact"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="联系方式(微信/电话)"
android:maxLines="1"
android:background="@drawable/bg_edittext"
android:padding="12dp"
android:layout_marginTop="8dp" />
<!-- 发布按钮 -->
<Button
android:id="@+id/btnPublish"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="发布商品"
android:textSize="16sp"
android:textStyle="bold"
android:background="@drawable/bg_button_primary"
android:textColor="@android:color/white"
android:layout_marginTop="24dp" />
</LinearLayout>
</ScrollView>

@ -0,0 +1,118 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="8dp">
<!-- 对方消息(左侧) -->
<LinearLayout
android:id="@+id/layoutLeft"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:visibility="gone">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:paddingHorizontal="16dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingEnd="48dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg_chat_message_left"
android:orientation="vertical"
android:padding="12dp">
<TextView
android:id="@+id/tvLeftMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="对方消息"
android:textColor="@android:color/black"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
<TextView
android:id="@+id/tvLeftTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="时间"
android:textColor="#999999"
android:textSize="10sp"
android:layout_marginTop="4dp"
android:layout_marginStart="12dp" />
</LinearLayout>
</LinearLayout>
<!-- 自己消息(右侧) -->
<LinearLayout
android:id="@+id/layoutRight"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:visibility="gone">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:paddingHorizontal="16dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="end"
android:paddingStart="48dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg_chat_message_right"
android:orientation="vertical"
android:padding="12dp">
<TextView
android:id="@+id/tvRightMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我的消息"
android:textColor="@android:color/white"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
<TextView
android:id="@+id/tvRightTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="时间"
android:textColor="#999999"
android:textSize="10sp"
android:layout_marginTop="4dp"
android:layout_gravity="end"
android:layout_marginEnd="12dp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="100dp"
android:padding="2dp">
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:background="@drawable/bg_image_border" />
<ImageView
android:id="@+id/btnDelete"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_marginTop="4dp"
android:layout_marginEnd="4dp"
android:src="@android:drawable/ic_delete"
android:background="@drawable/bg_delete_button" />
</RelativeLayout>

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="72dp"
android:background="@android:color/white"
android:padding="12dp">
<!-- 白色头像占位 -->
<ImageView
android:id="@+id/ivAvatar"
android:layout_width="48dp"
android:layout_height="48dp"
android:background="@drawable/bg_avatar_placeholder" />
<!-- 官方标识 -->
<ImageView
android:id="@+id/ivOfficial"
android:layout_width="12dp"
android:layout_height="12dp"
android:src="@drawable/ic_official"
android:layout_alignTop="@id/ivAvatar"
android:layout_alignEnd="@id/ivAvatar" />
<!-- 标题 -->
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="标题"
android:textSize="16sp"
android:textStyle="bold"
android:layout_toEndOf="@id/ivAvatar"
android:layout_marginStart="12dp"
android:layout_alignTop="@id/ivAvatar" />
<!-- 内容 -->
<TextView
android:id="@+id/tvContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="内容"
android:textSize="14sp"
android:textColor="#666666"
android:maxLines="1"
android:ellipsize="end"
android:layout_toEndOf="@id/ivAvatar"
android:layout_below="@id/tvTitle"
android:layout_marginStart="12dp"
android:layout_marginTop="4dp" />
<!-- 时间 -->
<TextView
android:id="@+id/tvTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="时间"
android:textSize="12sp"
android:textColor="#999999"
android:layout_alignParentEnd="true"
android:layout_alignTop="@id/tvTitle" />
<!-- 未读消息计数 -->
<TextView
android:id="@+id/tvUnreadCount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="18dp"
android:background="@drawable/bg_unread_count"
android:textColor="@android:color/white"
android:textSize="10sp"
android:gravity="center"
android:layout_alignParentEnd="true"
android:layout_below="@id/tvTime"
android:layout_marginTop="4dp" />
</RelativeLayout>

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp"
android:background="@android:color/white"
android:layout_marginBottom="8dp"
android:elevation="2dp">
<TextView
android:id="@+id/product_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="商品名称"
android:textColor="#333333"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/product_description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="商品描述"
android:textColor="#666666"
android:textSize="14sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:orientation="horizontal">
<TextView
android:id="@+id/product_category"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="类别"
android:textColor="#999999"
android:textSize="12sp" />
<TextView
android:id="@+id/product_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="¥0.00"
android:textColor="#ff6b35"
android:textSize="16sp"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>

@ -3,6 +3,25 @@
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<!-- 按钮颜色 -->
<color name="xianyu_yellow">#FFD700</color>
<color name="xianyu_yellow_dark">#FFC400</color>
<color name="xianyu_yellow_light">#FFE44D</color>
<!-- 文字颜色 -->
<color name="tab_text_normal">#666666</color>
<color name="tab_text_selected">#FFD700</color>
<!-- 其他颜色保持不变 -->
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<color name="gray">#FF9E9E9E</color>
<color name="green">#FF4CAF50</color>
<color name="logout_red">#FF5722</color>
<color name="primary_blue">#007BFF</color>
<color name="primary_blue_dark">#1976D2</color>
<color name="primary_blue_light">#64B5F6</color>
<color name="gray_300">#E0E0E0</color>
<color name="comui_tab_text_color">#ff333333</color>
</resources>

@ -1,3 +1,4 @@
<resources>
<string name="app_name">LLRiseTabBarDemo</string>
<string name="search_hint">Searchforproducts</string>
</resources>

@ -1,11 +1,9 @@
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<!--<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>-->
<item name="colorPrimary">@color/xianyu_yellow</item>
<item name="colorPrimaryDark">@color/xianyu_yellow_dark</item>
<item name="colorAccent">@color/xianyu_yellow</item>
</style>
</resources>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path name="external_files" path="." />
<cache-path name="cache_files" path="." />
</paths>

@ -1,15 +1,19 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
// Top-level build file where you can add configuration options common to all sub-projects/modules.
// Top-level build file where you can add configuration options common to all sub-projects/modules.
// project/build.gradle
buildscript {
ext.kotlin_version = '1.8.20' // 使 Kotlin
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.4.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
@ -18,8 +22,17 @@ allprojects {
google()
mavenCentral()
}
// 使 Kotlin
configurations.all {
resolutionStrategy {
force "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
force "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
force "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
}

@ -15,4 +15,7 @@
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# org.gradle.parallel=true
# gradle.properties
android.useAndroidX=true
android.enableJetifier=true

@ -1,6 +1,7 @@
#Sat Oct 11 19:07:18 CST 2025
# gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.0-milestone-1-bin.zip
distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-8.6-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save