我正在使用聊天应用程序,我需要每一秒钟刷新一次列表。我使用处理程序重复调用该方法,但是它没有更新< code>ListView。我正在调用该方法中更改的通知数据集。
Messages.java
public class Messages extends Activity {
ListView chatview;
ChatAdapter chatAdapter;
List<CBData> chatdata;
public int APP_REFRESH_TIME_IN_SEC = 1;
Button button2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.chat_details);
chatview = (ListView) findViewById(R.id.chatview);
chatdata = new ArrayList<CBData>();
chatAdapter = new ChatAdapter(getApplicationContext(), chatdata);
chatview.setAdapter(chatAdapter);
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
chatmethod();
handler.postDelayed(this, APP_REFRESH_TIME_IN_SEC * 1000);
}
}, APP_REFRESH_TIME_IN_SEC * 1000);
}
private void chatmethod() {
chatdata.clear();
String receiverid = getIntent().getStringExtra("ReceiverID");
String chaturl = Constant.URL + "chathome.php?sid=" + Session.getUserID(getApplicationContext()) + "&rid=" + receiverid;
Display.displaylog("Chat", chaturl);
JsonObjectRequest chatreq = new JsonObjectRequest(Request.Method.GET, chaturl, (String) null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray chatsarray = response.getJSONArray("chats");
for (int i = 0; i < chatsarray.length(); i++) {
JSONObject chatobj = chatsarray.getJSONObject(i);
CBData cbchat = new CBData();
cbchat.setOwerid(chatobj.getString("sender_id"));
cbchat.setChatmessage(chatobj.getString("message"));
chatdata.add(cbchat);
}
} catch (JSONException e) {
e.printStackTrace();
}
chatAdapter.notifyDataSetChanged();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Display.displaylog("ChatError", String.valueOf(error));
}
});
chatreq.setRetryPolicy(new DefaultRetryPolicy(500000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
AppController.getInstance().addToRequestQueue(chatreq);
}
}
聊天适配器.java
public class ChatAdapter extends BaseAdapter {
List<CBData> chatlist;
Context chatcontext;
LayoutInflater chatinflater;
public ChatAdapter(Context chatcontext, List<CBData> chatlist) {
this.chatcontext = chatcontext;
this.chatlist = chatlist;
}
@Override
public int getCount() {
return chatlist.size();
}
@Override
public Object getItem(int position) {
return chatlist.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
chatinflater = (LayoutInflater) chatcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Chatholder chatholder;
final CBData chatdatalist = chatlist.get(position);
String owerid = Session.getUserID(chatcontext);
if (convertView == null) {
chatholder=new Chatholder();
final boolean isMe = chatdatalist.getOwerid().equals(owerid);
if (isMe) {
convertView = chatinflater.inflate(R.layout.chatright, parent, false);
chatholder.chatbubble = (TextView) convertView.findViewById(R.id.chatbubble);
convertView.setTag(chatholder);
} else {
convertView = chatinflater.inflate(R.layout.chatleft, parent, false);
chatholder.chatbubble = (TextView) convertView.findViewById(R.id.chatbubble);
convertView.setTag(chatholder);
}
}else {
chatholder= (Chatholder) convertView.getTag();
}
chatholder.chatbubble.setText(chatdatalist.getChatmessage());
// TextView chatbubble = (TextView) convertView.findViewById(R.id.chatbubble);
return convertView;
}
static class Chatholder {
TextView chatbubble;
}
}
更新的Message.java
public class Messages extends Activity {
ListView chatview;
ChatAdapter chatAdapter;
List<CBData> chatdata;
public int APP_REFRESH_TIME_IN_SEC = 1;
Button button2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.chat_details);
chatview = (ListView) findViewById(R.id.chatview);
chatdata = new ArrayList<CBData>();
chatAdapter = new ChatAdapter(getApplicationContext(), chatdata);
chatview.setAdapter(chatAdapter);
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
chatmethod();
handler.postDelayed(this, APP_REFRESH_TIME_IN_SEC * 1000);
}
}, APP_REFRESH_TIME_IN_SEC * 1000);
}
private void chatmethod() {
chatdata = new ArrayList<CBData>();
String receiverid = getIntent().getStringExtra("ReceiverID");
String chaturl = Constant.URL + "chathome.php?sid=" + Session.getUserID(getApplicationContext()) + "&rid=" + receiverid;
Display.displaylog("Chat", chaturl);
JsonObjectRequest chatreq = new JsonObjectRequest(Request.Method.GET, chaturl, (String) null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray chatsarray = response.getJSONArray("chats");
for (int i = 0; i < chatsarray.length(); i++) {
JSONObject chatobj = chatsarray.getJSONObject(i);
CBData cbchat = new CBData();
cbchat.setOwerid(chatobj.getString("sender_id"));
cbchat.setChatmessage(chatobj.getString("message"));
chatdata.add(cbchat);
}
} catch (JSONException e) {
e.printStackTrace();
}
chatAdapter = new ChatAdapter(getApplicationContext(), chatdata);
chatview.setAdapter(chatAdapter);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Display.displaylog("ChatError", String.valueOf(error));
}
});
chatreq.setRetryPolicy(new DefaultRetryPolicy(500000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
AppController.getInstance().addToRequestQueue(chatreq);
}
}
ChatDetail.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#fff">
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@color/colorPrimary"
android:dividerHeight="2dp"
android:id="@+id/chatview" />
</LinearLayout>
ChatLeft.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Large Text"
android:id="@+id/chatbubble"
android:gravity="left"
android:textColor="#000"
android:padding="10dp"
android:layout_marginTop="5dp"
android:background="@drawable/chat_bg"
/>
</RelativeLayout>
chattright . XML
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Large Text"
android:id="@+id/chatbubble"
android:layout_gravity="right"
android:textColor="#000"
android:padding="10dp"
android:layout_marginTop="5dp"
android:layout_marginRight="5dp"
android:background="@drawable/chat_bg"
/>
</LinearLayout>
在聊天适配器内部添加删除代码
public void reload(List<CBData> chatlist) {
this.chatlist=chatlist;
notifyDataSetChanged();
}
替换<code>聊天数据。清除()tochatdata=newArrayList
更换<code>chatAdapter。notifyDataSetChanged()
至
chatAdapter.reload(chatdata);
尝试使用
((BaseAdapter) chatview.getAdapter()).notifyDataSetChanged();
问题内容: 我想知道为数千名用户编写聊天应用程序的正确方法是什么。 我只是感到困惑,我如何才能每秒使用AJAX或更少的方法来对服务器执行ping操作,并检查MySQL中是否有新记录等,并且服务器负载可以接受。 我目前正在考虑使用jQuery,PHP和MySQL进行编码。 请指教。您的帮助将不胜感激。 问题答案: 客户端 对于需要轮询服务器的任何程序,我建议使用WebSockets。 我写了一个非常
我正在使用XMPP在app引擎上编写一个聊天应用程序。我的想法是允许用户互相聊天。我可以将消息发送到google talk帐户,方法是将登录的用户删除地址的@gmail.com部分,并将其替换为@appid.appspotchat.com)。例如,如果登录的用户是bob@gmail.com,则用于发送的jid将是bob@appid.appspotchat.com)。然后,您可以将消息发送到goog
现在我们已经熟悉了Socket.IO,让我们编写一个聊天应用程序,我们可以用它在不同的聊天室聊天。 我们将允许用户选择用户名并允许他们使用它们进行聊天。 首先,让我们设置我们的HTML文件来请求用户名 - <!DOCTYPE html> <html> <head> <title>Hello world</title> </head> <script src = "/s
问题内容: 我正在使用Java和针对Java的Swing类进行聊天应用程序。 ChatServer类将是从客户端接收消息并回显所有客户端的服务器,但我仅打算为2个客户端进行聊天。 ChatClient类都是客户端。它们在“文本区域”上显示从服务器发送的内容。并将“文本字段”中的文本发送到服务器。 ChatClient类 ChatServer类 我对这个程序的过程的想法是: 启动ChatServer
我正在开发一个聊天应用程序,我正在使用光标适配器来显示聊天列表。聊天备份在服务器上,我们加载了更多聊天功能,允许用户从服务器获取他的最后50次聊天。 此loadmore按钮位于列表的顶部。 因此,当我将这些新聊天添加到我的数据库并交换光标以重新加载listview时,listview滚动位置不会被维护,列表会转到顶部,这不是正确的行为。我想保持listview滚动位置,就像按下load more聊
问题内容: 在我目前正在从事的项目中,我们需要开发一个Web聊天应用程序,而不是一个非常复杂的聊天,仅是一种将两个人联系起来谈论一个非常具体的话题的方式,我们不需要任何身份验证对于这两个用户之一,我们不必支持表情符号,头像或类似的东西。 一些项目成员建议我们可以通过BOSH使用XMPP,我说这就像试图用船网抓鱼,并提出了一种更简单的方法,例如简单的Ajax / MySQL网络聊天,但是我们担心性能