嗨,我有一个奇怪的麻烦,我没有得到泡沫,例如你在右边和我左边的消息......当我打电话给notifydatachanges时它会消除所有气泡...... plz引导我。下面是代码...
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>
greybox是9补丁图片。 sentmsg就像一个标志,这样我就可以根据收到或发送的消息来扩充所需的行......
答案 0 :(得分:0)
您尚未正确整理聊天数据。有一个包含聊天消息及其发件人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.