2016-04-08 3 views
0

Ich arbeite an einem Android-Projekt, in dem ich gerade an der Chat-Funktionalität arbeite. Wann immer ein Benutzer eine Nachricht sendet, wird sie nun in der ListView hinzugefügt, die von BaseAdapter ausgefüllt wird. Eine neue Nachricht wird von baseAdapterObject.add(item); hinzugefügt.Android: Zugriff auf Elemente in ListView, die mit BaseAdapter gefüllt sind

Jetzt, wenn ein Benutzer eine Nachricht sendet, füge ich ihn direkt zur bereits vorhandenen Liste hinzu und warte dann auf eine Antwort vom Server, die bestätigt, dass die Nachricht zugestellt wurde. Für den ersten Schritt möchte ich ein graues Häkchen anzeigen, und für die zweite vom Server empfangene Nachricht möchte ich ein blaues Häkchen anzeigen.

Leider weiß ich nicht, wie Sie auf die bereits gefüllte Liste zugreifen und das Hintergrundbild eines ImageView ändern.. Jede Nachricht hat eine Zufallszahl, mit der ich vergleichen kann, für welche Nachricht ich eine Bestätigung erhalten habe.

Code:

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> 

Ich hoffe, das viele Informationen enuf ist. Bitte lassen Sie mich wissen, wenn etwas anderes erforderlich ist. Vielen Dank. :-)

Antwort

0

Verwenden Sie ein Klassenobjekt, um zu helfen.

Zum Beispiel können Sie erstellen eine Liste der Nachrichtenobjekte:

class Message { 

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

    .... 
} 

Ändern Sie Ihre hashmap in Ihrem BaseAdapter in dem entsprechenden Objekt zu nehmen.

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

Von dort können Sie Ihre BaseAdapter setzen diese Werte zu lesen und die richtigen farbigen Zecken zur richtigen Zeit zeigen.

Hoffe, das hilft!

+0

Vielen Dank für die Antwort. Also, wann immer ich die Liste bevölke, sollte ich diese Liste anders oder zusammen füllen? Jede Nachricht hat eine eindeutige ID und ist Teil der Liste. Wie kann ich das blaue Häkchen hinzufügen, nachdem ich eine Bestätigung über die Nachricht erhalten habe? –

+0

Wenn Sie an jede Nachricht eine eindeutige ID angehängt haben, empfehle ich Ihnen, HashMap zu verwenden. Sie können die Nachricht von Ihrer HashMap abrufen und den Tick-Status ändern und eine notifyDatasetChanged anfordern, um Ihre Liste zu aktualisieren. – sihao

+0

Das hilft .... Ich werde es ausprobieren und bei Problemen wiederkommen. Vielen Dank. –

Verwandte Themen