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. :-)
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? –
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
Das hilft .... Ich werde es ausprobieren und bei Problemen wiederkommen. Vielen Dank. –