我知道这已被问过很多次了,甚至我已经很多时候解决了这个问题,但不知何故,我在这一点上非常震惊,无论如何我都无法让它工作。你们可以请看看
我正在使用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}}
答案 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数据库。列表视图应该观察该数据并显示它。幸运的是,ContentProvider
和CursorAdapter
就是这样。在文档中,它表示您不需要ContentProvider
,并且在某种程度上它是正确的,但您可以在光标中添加通知URI。
您应该使用Cursor
从SQLite数据库加载CursorLoader
,并将ListView
与CursorAdapter
一起使用。在您的SQLite助手上,您应该为数据设置通知URI并注册ContentObserver
以强制加载该数据。在对基础数据进行每次更改后,适配器将获得新的游标。你会像小狗一样快乐。