写一个自己的MyGPT app

news/2024/11/14 18:15:08/

chatGPT大火之后,国内外一众玩家撸起袖子热火朝天干了起来。

借助开源的GPT可以轻松的拥有自己的专属GPT,装装逼还是很好用的,也算赶一下chatGPT的风口。

这里使用ANYGPT,打造自已的GPT,AnyGPT API 开发者文档 · 语雀

AnyGPT服务器代码开源,他们也提供自己的API开放给大家使用,有服务器的朋友可以自己布署使用,没服务器的可以使用他们的API,需要更高级服务的可以买他们的会员。

有了个GPT开,做一个APP界面就可以了。这里使用

implementation 'me.himanshusoni.chatmessageview:chat-message-view:1.0.2'

来创建微信聊天窗口,自己写可以呀,有框架用着很快速。简单的布局,一个list用于显示消息,一个按钮录音,提供声音聊天,一个输入框用于输入聊天内容,一个发送按钮发送:

<RelativeLayoutandroid:id="@+id/widget_layout_meihua"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_above="@+id/send_message_layout"android:layout_marginStart="10dp"android:layout_marginLeft="10dp"android:layout_marginTop="10dp"android:layout_marginEnd="10dp"android:layout_marginRight="10dp"android:layout_marginBottom="10dp"android:clipToPadding="false"android:divider="@null"android:paddingTop="8dp" /><LinearLayoutandroid:id="@+id/send_message_layout"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:background="#ffdddddd"android:gravity="center_vertical"android:orientation="horizontal"><ImageViewandroid:id="@+id/iv_image"android:layout_width="40dp"android:layout_height="40dp"android:alpha=".5"android:background="?selectableItemBackground"android:contentDescription="@string/app_name"android:padding="2dp"android:src="@android:drawable/presence_audio_online" /><EditTextandroid:id="@+id/et_message"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:inputType="text" /><Buttonandroid:id="@+id/btn_send"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@android:drawable/editbox_background_normal"android:text="发送" /></LinearLayout></RelativeLayout>

布局显示大概如下,GPT有时会发脾气,飙外语,不知道哪国语言,显示不出来,哈哈:

 

两个重要的类用来显示消息,一个是消息结构,一个是adapter:

public class ChatMessageAdapter extends RecyclerView.Adapter<ChatMessageAdapter.MessageHolder> {private final String TAG = "ChatMessageAdapter";private static final int MY_MESSAGE = 0, OTHER_MESSAGE = 1;private List<ChatMessage> mMessages;private Context mContext;public interface OnClickListener {void onClick(int position, String message);}public interface OnLongClickListener {void onLongClick(int position, String message);}private OnClickListener clickListener;private OnLongClickListener longClickListener;public ChatMessageAdapter(Context context, List<ChatMessage> data) {mContext = context;mMessages = data;}public ChatMessageAdapter(Context context, List<ChatMessage> data, OnClickListener onClickListener, OnLongClickListener onLongClickListener) {mContext = context;mMessages = data;clickListener = onClickListener;longClickListener = onLongClickListener;}@Overridepublic int getItemCount() {return mMessages == null ? 0 : mMessages.size();}@Overridepublic int getItemViewType(int position) {ChatMessage item = mMessages.get(position);if (item.isMine()) return MY_MESSAGE;else return OTHER_MESSAGE;}@Overridepublic MessageHolder onCreateViewHolder(ViewGroup parent, int viewType) {if (viewType == MY_MESSAGE) {return new MessageHolder(LayoutInflater.from(mContext).inflate(R.layout.item_mine_message, parent, false));} else {return new MessageHolder(LayoutInflater.from(mContext).inflate(R.layout.item_other_message, parent, false));}}public void add(ChatMessage message) {mMessages.add(message);notifyItemInserted(mMessages.size() - 1);}@Overridepublic void onBindViewHolder(final MessageHolder holder, final int position) {ChatMessage chatMessage = mMessages.get(position);if (chatMessage.isImage()) {holder.ivImage.setVisibility(View.VISIBLE);holder.tvMessage.setVisibility(View.GONE);holder.ivImage.setImageResource(R.drawable.ic_launcher_background);} else {holder.ivImage.setVisibility(View.GONE);holder.tvMessage.setVisibility(View.VISIBLE);holder.tvMessage.setText(chatMessage.getContent());}String date = new SimpleDateFormat("hh:mm aa", Locale.getDefault()).format(new Date());holder.tvTime.setText("[单击复制]"+date);int index = position;if (clickListener != null){holder.chatMessageView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {clickListener.onClick(index, chatMessage.getContent());}});}if (longClickListener != null){holder.chatMessageView.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View view) {longClickListener.onLongClick(index, chatMessage.getContent());return false;}});}}class MessageHolder extends RecyclerView.ViewHolder {TextView tvMessage, tvTime;ImageView ivImage;ChatMessageView chatMessageView;MessageHolder(View itemView) {super(itemView);chatMessageView = (ChatMessageView) itemView.findViewById(R.id.chatMessageView);tvMessage = (TextView) itemView.findViewById(R.id.tv_message);tvTime = (TextView) itemView.findViewById(R.id.tv_time);ivImage = (ImageView) itemView.findViewById(R.id.iv_image);}}
}
public class ChatMessage {private boolean isImage, isMine;private String content;public ChatMessage(String message, boolean mine, boolean image) {content = message;isMine = mine;isImage = image;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public boolean isMine() {return isMine;}public void setIsMine(boolean isMine) {this.isMine = isMine;}public boolean isImage() {return isImage;}public void setIsImage(boolean isImage) {this.isImage = isImage;}
}

主要代码完了,使用神器retrofit接上api就上愉快的装逼了

 

 


http://www.ppmy.cn/news/74224.html

相关文章

哈希表题目:LRU 缓存

文章目录 题目标题和出处难度题目描述要求示例数据范围 前言解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;LRU 缓存 出处&#xff1a;146. LRU 缓存 难度 7 级 题目描述 要求 请你设计并实现一个满足最近最少使用&#xff08;LRU&#xff09;缓存约束…

【自己更换模型】如何用 Serverless 一键部署 Stable Diffusion?

作者&#xff1a;寒斜 上一篇讲了如何使用 Serverless Devs 和函数计算快速体验部署 Stable Diffusion&#xff0c;本篇继续聊聊如何解决动态模型加载的问题&#xff0c;从玩起来到用起来。 思路 其实很简单&#xff0c; 我们只需要将镜像里面的动态路径映射到 NAS [ 1] 文件…

UnityEngine.EventSystems详解

介绍 UnityEngine.EventSystems是Unity中的一个核心模块&#xff0c;用于处理用户输入事件和交互。它提供了许多接口和类来处理UI元素&#xff0c;例如按钮、滑动条、文本框等。使用该模块可以方便地实现用户界面的交互和响应。 方法 接口 IPointerClickHandler 当用户点击…

亚马逊产品开发

【一、找产品灵感】 需要不停的去找产品灵感&#xff0c;发起需求&#xff0c;我们到底是要做什么产品?当你看到一个产品&#xff0c;看到一个东西&#xff0c;应该先来考虑这个东西它的尺寸重量&#xff0c;以及在物流方面大概的成本会是多少&#xff0c;你能不能承受?然后…

自动构建之CMake

CMake 链接: 自动构建之MakeFile CMake也是一种用于自动化构建软件项目的工具。Cmake可以自动输出MakeFile文件&#xff0c;并且CMake是一个跨平台的构建系统&#xff0c;对于复杂的、跨平台的项目&#xff0c;CMake可能是一个更好的解决方案。 CMake的脚本文件是在CMakeLis…

DM8_dminit初始化工具介绍及使用

dminit介绍&#xff1a; dminit 是 DM 数据库初始化工具。在安装 DM 的过程中&#xff0c;用户可以选择是否创建初始 数据库。如果当时没有创建&#xff0c;那么在安装完成之后&#xff0c;可以利用创建数据库工具 dminit 来创建。可以利用 dminit 工具提供的各种参数&#xff…

smb配置,详细图文及配置

samba :网络文件共享服务 ​ Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件&#xff0c;而SMB是Server Message Block的缩写&#xff0c;即为服务器消息块&#xff0c;SMB主要是作为Microsoft的网络通讯协议&#xff0c;后来Samba将SMB通信协议应用到了Linux系统上…

我们为什么还要学习Altium Designer?

Altium Designe&#xff08;简称“AD”&#xff09;是电子设计领域中备受推崇的软件工具之一&#xff0c;拥有强大的功能和灵活的设计环境&#xff0c;也是要用最广泛的EDA工具之一&#xff0c;为电子工程师提供了无限可能&#xff0c;但很多工程师学完AD基本操作就转投其他EDA…