Java 无论我尝试什么,ListView都不会自动刷新

Java 无论我尝试什么,ListView都不会自动刷新,java,android,listview,signalr,android-arrayadapter,Java,Android,Listview,Signalr,Android Arrayadapter,我知道这已经被问了很多次,甚至我也解决了很多次类似的问题,但不知何故,我在这一点上是如此的震惊,我无法使它工作,反正我尝试这样做。你们能看看这个吗 我正在使用SignalR框架在Android和.NET中创建一个聊天应用程序,我已经成功地在Android的模型级别上实现了这一点,但在视图中事情变得很奇怪 -SignalR Server是基于C的控制台应用程序 -SignalR客户端是基于Android的 组成部分: 信息与活动: 是否有方法将消息发送到信号器服务器 静态\u方法\u到\u呈现\u

我知道这已经被问了很多次,甚至我也解决了很多次类似的问题,但不知何故,我在这一点上是如此的震惊,我无法使它工作,反正我尝试这样做。你们能看看这个吗

我正在使用SignalR框架在Android和.NET中创建一个聊天应用程序,我已经成功地在Android的模型级别上实现了这一点,但在视图中事情变得很奇怪

-SignalR Server是基于C的控制台应用程序

-SignalR客户端是基于Android的

组成部分:

信息与活动:

是否有方法将消息发送到信号器服务器

静态\u方法\u到\u呈现\u从\u自定义\u Api \u类收到的\u消息

自定义Api类非活动:

方法\u在\u消息\u活动中从\u信号器\u服务器\u调用\u传递消息\u&\u然后将\u传递消息\u呈现方法\u

流程:

-消息通过网络从消息_活动发送到控制台C信号服务器

-服务器通过调用对Custom_Api_类中存在的方法的远程调用,将此消息发送到目标客户机

-然后,此方法将该消息传递给message_Activity中的静态消息呈现方法,以便在ListView`中显示

问题:

-在将消息从自定义_Api_类接收到消息_活动类以在ListView上显示之后,它不会显示。。。除非ListView正在向上或向下滚动

结论:

-我理解ListView无法刷新的问题,我尝试了以下方法来解决它,但都是徒劳的

-在ArrayAdapter上调用notifyDataSetChanged

-在ListView上调用invalidateViews

-尝试将值添加到ArrayList中,该列表进入ArrayAdapter

-尝试将值直接添加到ArrayAdapter中

-android:stackFromBottom=true android:transcriptMode=alwaysScroll

有人能告诉我这里的核心问题是什么,以及有什么解决办法吗。。如果有人能帮我摆脱这一困境,我将不胜感激

编辑:

信号服务器调用的自定义Api类非活动中的代码:

尝试以下代码

new Handler().postDelayed(new Runnable() {
    @Override
    //automatically disappear after given time and start game
    public void run() {
        //call your loadingTask here

    }
}, refreshInterval);

希望这将帮助您尝试以编程方式滚动listView。大概是这样的:

 index = listView.getFirstVisiblePosition();
 View v = listView.getChildAt(0);
 top = v.getTop();
 adapter.notifyDataSetChanged();
 listView.setSelectionFromTop(index + numOfNewElements, top);

我再次给出同样的答案。有这么多人不使用内容提供商,这真是太惊人了

在您有网络操作的情况下,将数据保存在内存中并不是解决问题的非常有效的方法。您应该在收到数据后将其持久化到本地SQLite数据库。列表视图应该观察并显示该数据。幸运的是,有内容提供者和游标适配器。在文档中,它说您不需要ContentProvider,在某种程度上它是正确的,但您可以向光标添加通知URI


您应该做的是使用CursorLoader从SQLite数据库加载光标,并使用带有CursorAdapter的ListView。在SQLite助手上,应该为数据设置通知URI,并注册ContentObserver以强制加载该数据。在对基础数据进行每次更改后,适配器将获得新的游标。你会像小狗一样快乐。

在经历了大量的尝试和错误之后,这里是我对自己问题的答案

-我发现,我的UI线程很忙,当我在做System.out.println时,我得到的提示是Toast,它工作得很好,但Toast不起作用

-因此,我创建了一个非UI线程,然后将输出从其中的处理程序发布到列表中

-瞧!!它像黄油一样起作用

代码:


在ListView中添加项的地方发布代码为什么要涉及SQLite数据库来解决这样一个小问题,它就像一个临时聊天室,任何两个人都可以在这里交谈。。。。。。此外,在收集中保存数据,然后在listView上更新数据在技术上是非常正确的。。。。请告诉我为什么它在这个特定的场景中不起作用……这在技术上是不正确的。应用程序可以随时被操作系统关闭。你会丢失你的数据。欲了解更多信息,请参阅:首先,它在技术上并非错误,第二个操作系统只能在应用程序部分可见或完全不可见但仍在运行时干预关闭应用程序。。。。。。但我指的是应用程序完全可见,操作系统在此阶段无法关闭应用程序的阶段。最后。。。我并不担心数据来自何处,但我担心listView无法适应变化。。。现在请停止谈论ContentProvider,让我知道为什么ListView没有适应这些变化。你能证明你的论点吗,我很感兴趣。你不必太咄咄逼人。你刚才说…当应用程序完全可见并且操作系统在这个阶段无法关闭应用程序时,我真的希望看到一些证据。
new Handler().postDelayed(new Runnable() {
    @Override
    //automatically disappear after given time and start game
    public void run() {
        //call your loadingTask here

    }
}, refreshInterval);
 index = listView.getFirstVisiblePosition();
 View v = listView.getChildAt(0);
 top = v.getTop();
 adapter.notifyDataSetChanged();
 listView.setSelectionFromTop(index + numOfNewElements, top);
new Thread(new Runnable() {

        @Override
        public void run() {

            handler.post(new Runnable() {

                @Override
                public void run() {

                    mAdapter.add(msgFromUser);
                    mAdapter.notifyDataSetChanged();
                    listView_Message.invalidateViews();
                }
            });

        }
    }).start();