泡泡聊天问题的Android的ListView
你好我有一个奇怪的麻烦,我不gettings泡泡比如你内留言的权利,我的左...当过我称之为notifydatachanges它清除所有的泡沫......嘿指导我。下面是code ...
Hi i am having a strange trouble, i am not gettings bubble for example you messeges on right and mine on left... when ever i call notifydatachanges it erases all the bubbles...plz guide me. below is the code...
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就像一个标志,这样我可以根据消息recevied或发送膨胀所需的行...
greybox is 9 patch image. The sentmsg acts like a flag so that i can inflate the required row according to message recevied or sent...
您还没有组织您的聊天数据正常。有保存聊天消息和发件人ID的一类。
You have not organised your chat data properly. Have a class that holds a chat message and its sender id.
class Message {
int senderId;
String message;
}
使用这个对象来创建聊天消息的列表。然后,在适配器的 getview
办法做到这一点。
Use this object to create the list of chat messages. Then in adapter's getview
method do this
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.