气泡聊天问题Android listview
嗨,我有一个奇怪的问题,我没有得到的泡沫,例如你的messeges在右边和我的左边。。。每当我呼叫notifydatachanges时,它会清除所有气泡…请引导我。下面是代码气泡聊天问题Android listview,android,listview,chat,Android,Listview,Chat,嗨,我有一个奇怪的问题,我没有得到的泡沫,例如你的messeges在右边和我的左边。。。每当我呼叫notifydatachanges时,它会清除所有气泡…请引导我。下面是代码 private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { if(D) Log.d(TAG, "In the Handler"); s
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个补丁的图像。
sentmsg的作用类似于一个标志,因此我可以根据接收或发送的消息对所需行进行充气…您尚未正确组织聊天数据。拥有一个包含聊天信息及其发件人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.
你用xml设置气泡吗?你在哪里?是的。。我有两个xml,一个用于接收消息,一个用于发送消息..是的,灰盒是9补丁图像。。。我在xmlWhy do
if(sentmsg==1)
中设置了气泡?将xml布局添加到您的问题中。编辑你的问题