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

时间:2014-05-23 06:07:27

标签: java android listview signalr android-arrayadapter

我知道这已被问过很多次了,甚至我已经很多时候解决了这个问题,但不知何故,我在这一点上非常震惊,无论如何我都无法让它工作。你们可以请看看

我正在使用SignalR framework在Android和.NET中创建一个聊天应用,并且我已经成功地在Android的模型级别实现了这一点,但事情对于视图来说很奇怪。

- SignalR Server此处为C# based console App

- SignalR Client基于Android

组件:

Message_Activity:

has_Method_To_Send_Message_To_SignalR_Server()

static_Method_To_Render_The_Message_Received_From_Custom_Api_Class()

Custom_Api_Class(非活动):

method_invoked_From_SignalR_Server_To_Pass_Message_&_Then_Pass_To_Message_Rendering_Method_In_Message_Activity()

流程:

- 消息通过网络从 Message_Activity 发送到 Console C# SignalR server

- Server send此消息发送到目标客户端,方法是调用remote call中的Custom_Api_Class方法。

- 然后,此方法将消息传递给Message_Activity static Message Rendering Method ListView`中的for display in the

问题:

- 在从Custom_Api_Class收到Message_Activity课程的邮件,以便在ListView上显示该邮件后,该邮件未显示。 .. 除非 ListView 向上或向下滚动

结论:

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

- notifyDataSetChanged

上调用ArrayAdapter

- invalidateViews上调用ListView

- 尝试将值添加到ArrayList<String>进入ArrayAdapter

ArrayAdapter

- 通过直接将值添加到android:stackFromBottom="true"来尝试。

- android:transcriptMode="alwaysScroll"        Subscription subs = hub.subscribe("receiveMessage"); subs.addReceivedHandler(new Action<JsonElement[]>() { @Override public void run(JsonElement[] obj) throws Exception { MessageActivity.receiveText(obj[0].toString().replaceAll("\"","")+" "+obj[1].toString().replaceAll("\"","")); } });

任何人都可以让我知道这里的核心问题是什么,以及任何解决方案..如果有人可以帮助我,我会更有责任。

编辑:

SignalR Server调用的Custom_Api_Class(非活动)中的代码:

public static void receiveText(String msgFromUser) {

        mAdapter.add(msgFromUser);
        listView_Message.post(new Runnable() {
            @Override
            public void run() {
                // Select the last row so it will scroll into view...
                listView_Message.setSelection(mAdapter.getCount() - 1);
            }
        });
        mAdapter.notifyDataSetChanged();


    }

Message_Api_Class调用的Message_Activity中的代码:

{{1}}

4 个答案:

答案 0 :(得分:1)

尝试以编程方式滚动listView。像这样:

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

答案 1 :(得分:0)

好吧,经过大量的试验和错误,这是我对自己问题的回答.........

- 我弄清楚了,我的UI thread ,我得到的提示是{{1 }},当我正在做Toast工作,但System.out.println() 没有工作

- 所以我创建了一个Toast,然后将输出结果发布到列表中的Non-UI Thread内。

- Voila !!它就像黄油一样。

<强>代码:

Handler

答案 2 :(得分:-1)

尝试以下代码

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

    }
}, refreshInterval);

希望这会对你有所帮助

答案 3 :(得分:-1)

我再次给出同样的答案。令人瞩目的是,有多少人没有使用内容提供商。

在您的情况下,您有网络操作,在内存中保存数据不是解决问题的非常有效的方法。您应该在收到数据后将数据保存到本地SQLite数据库。列表视图应该观察该数据并显示它。幸运的是,ContentProviderCursorAdapter就是这样。在文档中,它表示您不需要ContentProvider,并且在某种程度上它是正确的,但您可以在光标中添加通知URI。

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