2011-09-17 121 views
1

enter image description here泡泡聊天問題的Android的ListView

你好我有一個奇怪的麻煩,我不gettings泡比如你內留言右側和我左邊......當過我叫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

你是否設置在XML氣泡?你在哪裏設置? – Ronnie

+0

yess ..我有2 xml一個接收消息一個發送消息.. – Programmer

+0

是的灰箱是9補丁圖像...我設置泡沫在xml – Programmer

回答

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. 
+0

這是一個非常好的提示..謝謝..我現在做了。 – Programmer