Android 列表视图的 Bubble Chat 问题

2023-12-02

enter image description here

嗨,我遇到了一个奇怪的麻烦,我没有得到气泡,例如你的消息在右边,我的消息在左边...当我调用notifydatachanges时,它会删除所有的气泡...请指导我。下面是代码...

private final Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {

        if(D) Log.d(TAG, "In the Handler");
        switch (msg.what) {
            case PACKET_CAME:
                String incomingMessage = (String) msg.obj;
                receivedMessages.add("You: " + incomingMessage);

                mg = new Message();
                mg.what = 1;
                updateListHandler.sendMessage(mg);

       //         mAdapter.notifyDataSetChanged();

       //       mAdapter.notifyDataSetInvalidated();

                break;
            case TOAST:
                String toastToMake= (String) msg.obj;
                Toast.makeText(getApplicationContext(), toastToMake,    Toast.LENGTH_SHORT).show();
                break;               
        }
      }
    };   

/** Called when the activity is first created. */
     @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    send    = (Button)findViewById(R.id.send);
    send.setOnClickListener(send_listener);

    //msgList.setTextFilterEnabled(true);


    msg     = (EditText)findViewById(R.id.msg);
    msg.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // If the event is a key-up event on the "enter" button
            if ((event.getAction() == KeyEvent.ACTION_UP) &&
                    (keyCode == KeyEvent.KEYCODE_ENTER)) {
                postMessage();
                return true;
            }
            return false;
        }
    });

    // Start my server thread
    myThread = new ServerThread(getApplicationContext(),mHandler);

    //Check if it's running
    if (!myThread.socketIsOK()){
       Log.e(TAG,"Server NOT STARTED");
       Toast.makeText(getApplicationContext(), "Cannot Start Server: ", Toast.LENGTH_LONG).show();
       return;
     }

       // All appears to be OK, start the main loop
       myThread.start();
       Log.i(TAG,"Server Started");


     msgList = (ListView)findViewById(R.id.msgList);
     mAdapter = new CustomAdapter();
     msgList.setAdapter(mAdapter);


    }// end OnCreate()

   public class CustomAdapter extends BaseAdapter {
    public CustomAdapter(){
    // TODO Auto-generated constructor stub
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {         

            LayoutInflater inflater = getLayoutInflater();
            View row = null;
            Log.i("sentmsg", Integer.toString(sentmsg));
            Log.i("revmsg", Integer.toString(recvmsg));

            if(sentmsg == 1){
                row = inflater.inflate(R.layout.message, parent, false);
                TextView tv =   (TextView)row.findViewById(R.id.textmsg);       
                tv.setText(receivedMessages.get(position));                 
                sentmsg = 0;
            }else{
                row = inflater.inflate(R.layout.messagert, parent, false);
                TextView tv = (TextView)row.findViewById(R.id.textmsg);     
                tv.setText(receivedMessages.get(position));                 
            }


            return row;
        }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return receivedMessages.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }
    }


  // Sends the message in the msg EditText
   private void postMessage(){
    String theNewMessage = msg.getText().toString();

    try{
        myThread.sendMessage(theNewMessage);
    }catch(Exception e){
        Log.e(TAG,"Cannot send message"+e.getMessage());
    }
    sentmsg = 1;
    receivedMessages.add("Me: " + theNewMessage);

    Message msg = new Message();
    msg.what = 1;
    updateListHandler.sendMessage(msg);

  //    msgList.invalidateViews();
  //  mAdapter.notifyDataSetChanged();
  //  mAdapter.notifyDataSetInvalidated();
  //  msgList.invalidateViews();
  }

  private Handler updateListHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case 1:
            mAdapter.notifyDataSetChanged();
            break;
        }
        ;
    };
   };





  // On click listener for the button
  private OnClickListener send_listener = new OnClickListener() {
    public void onClick(View v) {
        postMessage();
    }
  };

  @Override
  public void onDestroy(){
    super.onDestroy();
    myThread.closeSocket();
  }

   }// Activity class

这是 XML

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textmsg"
android:layout_marginTop="2px"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:textSize="16sp" 
android:background="@drawable/greybox">
 </TextView>
</LinearLayout>

这是另一个 xml

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent">
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/textmsg"
 android:layout_marginTop="2px"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:padding="10dp"
 android:textSize="16sp">
 </TextView>  
 </LinearLayout>

灰盒是 9 个补丁图像。 sendmsg 的作用就像一个标志,以便我可以根据收到或发送的消息来膨胀所需的行......


您没有正确组织您的聊天数据。有一个包含聊天消息及其发件人 ID 的类。

class Message {
   int senderId;
   String message;
}

使用此对象创建聊天消息列表。然后在适配器的getview方法这样做

Message msg = messageList.get(position);
if (msg.getSenderId() == getMyId()) { // if its the message sent by me?
    // inflate right side layout.
else 
    // inflate left side layout.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 列表视图的 Bubble Chat 问题 的相关文章

  • 什么是适合 Android 的 html 解析器?

    什么是适合 Android 的 html 解析器 这取决于你想做什么 如果你真的想处理 html Java 中有很多 html 解析器可以使用 这里有一些 https stackoverflow com questions 2168610
  • 如何自定义 Firebase 身份验证 ui

    我正在使用 Firebase Auth Ui 进行号码验证 我有一些要求 需要更改国家旋转器下拉项目的文本和背景颜色 我正在使用下面的样式 但它不会改变下拉菜单的背景颜色或项目的文本颜色 style name FirebaseUI Coun
  • 数据库“/data/data/msv_database.db”的连接池无法授予连接。连接数:0 个活动连接、1 个空闲连接、0 个可用连接

    我收到以下错误 在整个应用程序中使用单个数据库对象从两个不同线程访问数据库时 数据库连接池 data data msv database db 无法授予与线程 802 的连接 连接数 0 个活动连接 1 个空闲连接 0 个可用连接 也许您想
  • Android:java.lang.OutOfMemoryError:

    我在 Android 上开发了一个使用大量图像的应用程序 可绘制文件夹中有很多图像 比如说超过 100 张 我正在开发图像动画应用程序 我使用 imageview 来显示 GIF 图像 我使用了将 gif 图像分割成多个 PNG 格式图像的
  • 由于现有相机用户,相机“0”的手电筒不可用

    我想创建一个应用程序 它有一个用于录制视频的按钮和另一个单独的切换按钮 用于在录制视频期间打开闪光灯 我已经使用camera2 API为最近的androids构建了相机应用程序 可以通过图像按钮访问 我将火炬模式设置为切换按钮 但这根本不起
  • Android任务执行中的“platformAttrExtractor”是什么?

    我介绍了我的构建关注者操作说明 https developer android com studio build optimize your build html profile在安卓中 gradlew profile recompile
  • 具有自定义厚度的虚线分隔符

    我有一个虚线分隔符
  • Android 软键盘 - 禁用某些键

    我正在寻找一种使用内置软键盘并禁用某些键的方法 例如 如果用户不应该使用字母 f 因为在列表中该字母不存在 则该键应显示为灰色 想象一下 用户可以在文本框中键入文本以从列表中进行选择 该列表包含 ABC BCCD 床 如果用户输入 A 然后
  • 如何检查 Android 设备是否在线

    我的服务器不断检查我的 Android 应用程序是否在线 请问我可以在我的android应用程序上执行哪些操作 创建一个名为 isNetworkAvailable 的帮助器方法 该方法将根据网络是否可用返回 true 或 false 它看起
  • Android:将图像裁剪为特定尺寸

    我的目的是让用户从图库中选择一张图像 然后进行裁剪活动 但是 我需要将定义裁剪蒙版的矩形锁定到某个尺寸 然后用户只需重新定位它即可显示图像的一部分 关于如何做到这一点有什么想法吗 Thanks T Intent intent new Int
  • Android 中是否可以使用滑动视图导航的刻度线?

    我想在 Android 应用程序中创建一组页面 这些页面可以水平滑动并使用刻度线来指示当前页面在我拥有的 12 个页面集中的位置 Android 设计文档中提到了像这样使用刻度线的设计模式 http developer android co
  • Android:将声音保存为铃声/SQLiteConstraintException

    我正在尝试使用 Android 将声音保存为铃声this http www stealthcopter com blog 2010 01 android saving a sound file to sd from resource and
  • 使用全局变量从内部函数获取空字符串

    请帮助我解决一些小问题 我确信你能做到 D 我试图在 firestore 文档 user cases information 上设置一个字段 其中包含一个字段 case number 首先我声明这个全局变量 private String c
  • 可以用 Django 制作移动应用程序吗?

    我想知道我是否可以在我的网站上使用 Django 代码 并以某种方式在移动应用程序 Flutter 等框架中使用它 那么是否可以使用我现在拥有的 Django 后端并在移动应用程序中使用它 所以就像models views etc 是的 有
  • “添加到 FragmentContainerView 的视图必须与 Fragment 关联”与 android 导航组件

    当导航组件切换到片段时 我收到 添加到 FragmentContainerView 的视图必须与片段关联 崩溃 这是什么原因造成的 我没有在任何地方看到提到这一点 并且花了一段时间才弄清楚 但在这种情况下 我试图在迁移到导航拱门组件时设置一
  • java.lang.AssertionError:CALL 'public final fun

    我正在尝试使用 jetPack Compose 制作一个项目 我拥有它工作所需的所有必要依赖项 但是当我运行我的应用程序时 它会抛出一个错误 我找不到解决方案 这是错误 java lang AssertionError CALL publi
  • 绘制平滑曲线

    我想创建更平滑的曲线 而不仅仅是线角 这是我现在画的图 这是我的代码 case FREEHAND float pts float ptk ptk new float 2 imageMatrix invert inv if mCurrentS
  • 如何告诉 OkHttpClient 忽略缓存并强制从服务器刷新?

    在我的 Android 应用程序中 我将 Retrofit 与 OkHttpClient 结合使用 并启用缓存来访问某些 API 我们的一些 API 有时会返回空数据 我们在应用程序中提供了一个 刷新 按钮 供客户端从特定 API 重新加载
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • Android 导航组件 - 从“任何地方”/基本片段导航?

    我正在开发一个应用程序 它有一个奇怪的花招 可以在设备旋转时打开特定的片段 在实现 android 的导航组件之前 所需要的只是对当前活动的引用 并且可以在特定时刻向用户显示的任何内容之上执行手动片段事务 但是在转移到导航组件之后 我发现很

随机推荐

  • 基于其他文本列将数字列添加到 pandas 数据框[重复]

    这个问题在这里已经有答案了 我有这个数据框 df pd DataFrame 137 earn 158 earn 144 ship 111 trade 132 trade columns value topic print df value
  • 将 MFC 中的大型项目从 Visual C++ 6.0 迁移到 Visual Studio 2005

    我正在 Visual C 6 0 中维护一个大项目 250k loc 不包括从 idl 生成的代码 该项目使用 Visibroker 简称 VB 5 2 1 这是 Borland 的 CORBA 实现 最近 与我的项目通信的另一个模块升级到
  • 如何使用tabletop.js向传单地图添加标记?

    我正在使用这个非常好的指南将标记从 Google 工作表添加到基本的 leaflet js 地图 https rdrn me leaflet maps google sheets 问题是 在这里使用这些代码片段 我得到了控制台中记录和返回的
  • Powershell 如何知道在哪里可以找到要导入的模块?

    对于使用命令行开关和 powershell 的东西 我确实处于初学者水平 我使用 PowerShell API 从 C 调用 commandlet 我看到了奇怪的行为 在 stackoverfow 上的不同线程上 人们使用 Import C
  • SQL 查询返回笛卡尔积

    我有一些表 Employee id name id suc id dep id sec Suc id suc name Dep id dep id suc name Sec id sec id dep id suc name 不要责怪我 这
  • PHP 基础知识 - PHP 使用的 MySQL 密码存储在哪里

    我是网络开发新手 我正在学习 PHP 以便出售一些二进制文件 共享 Linux 主机 该网站尚未上线 我的php脚本 50 借用代码 50 自写 95 完全理解 登录MySQL来读取待售物品 并将销售交易数据写入另一个表中 Function
  • 如何检查服务器使用的 EL 版本

    我如何检查服务器使用的 EL 版本是什么 我正在运行 Websphere 7 EL 类位于 j2ee jar 中 清单如下 Manifest Version 1 0 Ant Version Apache Ant 1 6 5 Created
  • Java:将图像移向鼠标位置

    这是鲍勃 我已经知道如何让他rotate由于这个问题 朝向鼠标位置 https stackoverflow com posts 26607930 edit 我一切正常 但仍然无法做到move按下按键时他朝向鼠标位置 这是一个例子 impor
  • 可变长度霍夫曼码的比特流 - 如何写入文件?

    我正在用 C 语言开发霍夫曼编码 解码项目 并且很好地了解算法应如何存储有关霍夫曼树的信息 在解码期间重新构建树 以及使用可变长度代码解压缩到原始输入文件 当写入我的压缩文件时 我将输出一个包含唯一频率的 256 个 4 字节整数的表 并且
  • Linux下跨进程共享数据

    在我的应用程序中 我有一个进程分叉一个子进程 例如 child1 并且该子进程在磁盘上写入一个巨大的二进制文件并退出 然后 父进程派生出另一个子进程 child2 该子进程读取这个巨大的文件以进行进一步的处理 文件转储和重新加载使我的应用程
  • ObservableCollection 和 Item PropertyChanged

    我看过很多关于这个问题的讨论 但也许我只是一个新手 无法理解它 如果我有一个可观察的集合 它是 PersonNames 的集合 如 msdn 示例中所示 http msdn microsoft com en us library ms748
  • C 中的波形符运算符

    我见过 ELF 哈希算法中使用的波形符运算符 我很好奇它的作用 代码是来自永远的迷茫 unsigned elf hash void key int len unsigned char p key unsigned h 0 g int i f
  • Python 中对象的布尔值

    众所周知 Python 对对象有布尔值 如果一个类有一个 len 方法 它的每个实例 len 碰巧返回 0 将被评估为布尔值False 例如 空列表 事实上 每个可迭代的空自定义对象都被评估为False如果它出现在布尔表达式中 现在假设我有
  • 基于鼠标的Unity3d瞄准

    我正在制作炮弹射击游戏 这是一个简短的代码 我在其中计算瞄准方向 Vector3 mousePos Input mousePosition mousePos z thisTransform position z camTransform p
  • 为什么在调用 jnz 之前要将一个值与其自身进行“或”操作?

    我正在阅读一些执行以下操作的代码 OR al al JNZ loc 123456 如果我没读错的话 OR命令只是设置一个标志位 然后测试该寄存器是否有任何非零值 为什么要这样写而不是这样写 CMP al 0 JNE loc 123456 哪
  • 在 WooCommerce 中显示产品类别的随机产品缩略图

    我正在尝试提取随机产品缩略图以在我的页面之一上显示为图像 我似乎找不到有效的方法 并尝试了以下解决方案this and this post 在 div 中回显它也是有益的 这是我目前正在尝试的 但我仍然不确定如何做到这一点 函数 php f
  • 使用 C# 从 xml 文件获取值

    我对 xml 很陌生 我不知道如何从下面的 xml 文件中读取 获取值
  • 无法从 Android 设备在 Facebook 页面中看到类似选项

    I am trying to open a facebook page from my app in both android and ios In ios the page shows LIKE button but in android
  • 使用参数化 SqlCommand 是否可以使我的程序免受 SQL 注入的影响?

    我知道SQL注入是相当危险的 现在 在我的 C 代码中 我使用以下命令编写参数化查询SqlCommand class SqlCommand command command CommandText SELECT FROM Jobs WHERE
  • Android 列表视图的 Bubble Chat 问题

    嗨 我遇到了一个奇怪的麻烦 我没有得到气泡 例如你的消息在右边 我的消息在左边 当我调用notifydatachanges时 它会删除所有的气泡 请指导我 下面是代码 private final Handler mHandler new H