2016-04-08 53 views
0

我正在開發一個Android項目,其中我目前正在使用聊天功能。現在,無論何時用戶發送消息,都會將其添加到由BaseAdapter填充的ListView中。 baseAdapterObject.add(item);添加新消息。Android:使用BaseAdapter填充ListView中的訪問元素

現在,無論何時用戶發送消息,我都將其直接添加到已存在的列表中,然後等待服務器的答覆,確認消息已發送。對於第一步,我想顯示一個灰色複選標記,對於從服務器收到的第二條消息,我想顯示藍色複選標記。

不幸的是,我不知道如何訪問已填充的列表並更改ImageView的背景圖像。。每封郵件都有一個隨機數,我可以比較哪些郵件收到確認。

代碼:

public void recieveUpdatedMessageFromServer(String channelName, Map<String, Object> input){ 
     String randomNumberFromServer = ((Map) input.get("data")).get("random").toString(); 
     if (randomNumberFromServer.equals(randomNos)) { 
      messageRecieved = true; 
      randomNos = ""; 
     } 
    chatMessagesAdapter.add(insertMap); 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         chatMessagesAdapter.notifyDataSetChanged(); 
        } 
       }); 

    public class ChatMessagesAdapter extends BaseAdapter { 


     private Activity activity = null; 
     private ArrayList<HashMap<String, String>> data; 
     private LayoutInflater inflater = null; 

     public ChatMessagesAdapter(Activity a, ArrayList<HashMap<String, String>> d) { 
      activity = a; 
      data = d; 
      inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     } 

     public void add(HashMap<String, String> item) { 
      data.add(item); 

     } 

     @Override 
     public int getCount() { 
      return data.size(); 
     } 

     @Override 
     public Object getItem(int position) { 
      return position; 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 

      View vi = convertView; 
      if (convertView == null) 
       vi = inflater.inflate(R.layout.chat_messages_row, parent, false); 

      TextView chatText = (TextView) vi.findViewById(R.id.chatText); 
      ImageView userImage = (ImageView) vi.findViewById(R.id.chatImage); 
      TextView firstName = (TextView) vi.findViewById(R.id.personName); 
      ImageView checkMark = (ImageView) vi.findViewById(R.id.checMarkChat); 
      HashMap<String, String> chatList; 
      chatList = data.get(position); 

      chatText.setText(chatList.get(ChatMessagesActivity.chatText)); 
      checkMark.setBackgroundResource(R.drawable.blue_icon); 
      firstName.setText(chatList.get(ChatMessagesActivity.firstName)); 
      if (!(chatList.get(ChatMessagesActivity.chatImageId).equals("0"))) { 
       Picasso.with(context).load(StaticRestTemplate.baseURL + "image/" + chatList.get(ChatMessagesActivity.chatImageId)).fit().into(userImage); 
      } 
      return vi; 
     } 
    } 
} 

chat_messages_row.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="130dp" 
    android:orientation="horizontal" 
    android:padding="2.5dip"> 

    <FrameLayout 
     android:layout_width="wrap_content" 
     android:layout_height="125dp" 
     android:id="@+id/frameLayout2"> 

     <ImageView 
      android:id="@+id/chatImage" 
      android:layout_width="107dp" 
      android:layout_height="107dp" 
      android:padding="2dp" /> 

    </FrameLayout> 

    <TextView 
     android:id="@+id/chatText" 
     android:layout_width="230dp" 
     android:layout_height="76dp" 
     android:layout_gravity="right|center_vertical" 
     android:layout_alignParentBottom="true" 
     android:layout_toRightOf="@+id/frameLayout2" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:id="@+id/personName" 
     android:layout_alignParentTop="true" 
     android:layout_alignRight="@+id/chatText" 
     android:layout_alignEnd="@+id/chatText" 
     android:layout_toRightOf="@+id/textView" 
     android:layout_toEndOf="@+id/textView" 
     /> 

    <ImageView 
     style="?android:attr/buttonStyleSmall" 
     android:layout_width="40dp" 
     android:layout_height="40dp" 
     android:id="@+id/checMarkChat" 
     android:background="@drawable/blue_icon" 
     android:layout_alignParentBottom="true" 
     android:layout_alignRight="@+id/personName" 
     android:layout_alignEnd="@+id/personName" /> 


    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceSmall" 
     android:text="Small Text" 
     android:id="@+id/textView" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_marginLeft="49dp" 
     android:layout_marginStart="49dp" 
     android:layout_marginTop="208dp" /> 
</RelativeLayout> 

我希望這麼多的信息enuf。請讓我知道是否有其他要求。謝謝。 :-)

回答

0

考慮使用類對象來提供幫助。在你BaseAdapter

class Message { 

    private String message; 
    private boolean gray_tick; 
    private boolean blue_tick; 

    .... 
} 

更改您的HashMap來採取相應的對象:

例如,您可以的消息對象創建一個列表。

private ArrayList<HashMap<String, Message>> data; 

從那裏,你可以設置你BaseAdapter讀取這些值,並在正確的時間顯示正確的顏色刻度。

希望這會有所幫助!

+0

謝謝你的回覆。所以,無論何時我填充列表,我應該填充這個列表不同或一起?每個味精都附有一個唯一的ID,並且是列表的一部分。我收到關於消息的確認後,如何添加藍色勾號標記? –

+0

如果你有一個唯一的ID附加到每條消息,我會建議你使用HashMap 你可以從你的HashMap中檢索消息並更改打勾狀態並請求notifyDatasetChanged來更新你的列表。 – sihao

+0

這有助於....我會嘗試一下,如果我有任何問題,請回復您。謝謝。 –