diff --git a/LLRiseTabBarDemo/.idea/misc.xml b/LLRiseTabBarDemo/.idea/misc.xml index bed3990..945b05a 100644 --- a/LLRiseTabBarDemo/.idea/misc.xml +++ b/LLRiseTabBarDemo/.idea/misc.xml @@ -1,3 +1,4 @@ + @@ -182,6 +183,13 @@ + + + diff --git a/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/activity/ChatActivity.java b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/activity/ChatActivity.java new file mode 100644 index 0000000..a7174ee --- /dev/null +++ b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/activity/ChatActivity.java @@ -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 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 "收到您的消息了!"; + } + } +} \ No newline at end of file diff --git a/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/adapter/ChatMessageAdapter.java b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/adapter/ChatMessageAdapter.java new file mode 100644 index 0000000..6f80a10 --- /dev/null +++ b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/adapter/ChatMessageAdapter.java @@ -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 { + + private Context context; + private List messageList; + + public ChatMessageAdapter(Context context, List 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); + } + } +} \ No newline at end of file diff --git a/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/adapter/MessageAdapter.java b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/adapter/MessageAdapter.java new file mode 100644 index 0000000..cd92caa --- /dev/null +++ b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/adapter/MessageAdapter.java @@ -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 { + + private Context context; + private List messageList; + private OnItemClickListener onItemClickListener; + + public MessageAdapter(Context context, List 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); + } + } +} \ No newline at end of file diff --git a/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/model/ChatMessage.java b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/model/ChatMessage.java new file mode 100644 index 0000000..5693307 --- /dev/null +++ b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/model/ChatMessage.java @@ -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; } +} \ No newline at end of file diff --git a/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/model/MessageItem.java b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/model/MessageItem.java new file mode 100644 index 0000000..40e105b --- /dev/null +++ b/LLRiseTabBarDemo/app/src/main/java/com/startsmake/llrisetabbardemo/model/MessageItem.java @@ -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; } +} \ No newline at end of file diff --git a/LLRiseTabBarDemo/app/src/main/res/drawable/bg_avatar_placeholder.xml b/LLRiseTabBarDemo/app/src/main/res/drawable/bg_avatar_placeholder.xml new file mode 100644 index 0000000..4947039 --- /dev/null +++ b/LLRiseTabBarDemo/app/src/main/res/drawable/bg_avatar_placeholder.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/LLRiseTabBarDemo/app/src/main/res/drawable/bg_chat_input.xml b/LLRiseTabBarDemo/app/src/main/res/drawable/bg_chat_input.xml new file mode 100644 index 0000000..a5a2d18 --- /dev/null +++ b/LLRiseTabBarDemo/app/src/main/res/drawable/bg_chat_input.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/LLRiseTabBarDemo/app/src/main/res/drawable/bg_chat_message_left.xml b/LLRiseTabBarDemo/app/src/main/res/drawable/bg_chat_message_left.xml new file mode 100644 index 0000000..b73bbc7 --- /dev/null +++ b/LLRiseTabBarDemo/app/src/main/res/drawable/bg_chat_message_left.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/LLRiseTabBarDemo/app/src/main/res/drawable/bg_chat_message_right.xml b/LLRiseTabBarDemo/app/src/main/res/drawable/bg_chat_message_right.xml new file mode 100644 index 0000000..2f28ecb --- /dev/null +++ b/LLRiseTabBarDemo/app/src/main/res/drawable/bg_chat_message_right.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/LLRiseTabBarDemo/app/src/main/res/drawable/bg_search_edittext.xml b/LLRiseTabBarDemo/app/src/main/res/drawable/bg_search_edittext.xml new file mode 100644 index 0000000..76833e1 --- /dev/null +++ b/LLRiseTabBarDemo/app/src/main/res/drawable/bg_search_edittext.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/LLRiseTabBarDemo/app/src/main/res/drawable/bg_unread_count.xml b/LLRiseTabBarDemo/app/src/main/res/drawable/bg_unread_count.xml new file mode 100644 index 0000000..b8d4012 --- /dev/null +++ b/LLRiseTabBarDemo/app/src/main/res/drawable/bg_unread_count.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/LLRiseTabBarDemo/app/src/main/res/drawable/ic_official.xml b/LLRiseTabBarDemo/app/src/main/res/drawable/ic_official.xml new file mode 100644 index 0000000..ab8bbd6 --- /dev/null +++ b/LLRiseTabBarDemo/app/src/main/res/drawable/ic_official.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/LLRiseTabBarDemo/app/src/main/res/layout/activity_chat.xml b/LLRiseTabBarDemo/app/src/main/res/layout/activity_chat.xml new file mode 100644 index 0000000..9dd7fcd --- /dev/null +++ b/LLRiseTabBarDemo/app/src/main/res/layout/activity_chat.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/LLRiseTabBarDemo/app/src/main/res/layout/item_chat_message.xml b/LLRiseTabBarDemo/app/src/main/res/layout/item_chat_message.xml new file mode 100644 index 0000000..f1bc9be --- /dev/null +++ b/LLRiseTabBarDemo/app/src/main/res/layout/item_chat_message.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/LLRiseTabBarDemo/app/src/main/res/layout/item_message.xml b/LLRiseTabBarDemo/app/src/main/res/layout/item_message.xml new file mode 100644 index 0000000..c531eb1 --- /dev/null +++ b/LLRiseTabBarDemo/app/src/main/res/layout/item_message.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file