0

Ich arbeite an einer Messaging-Anwendung und möchte die Chat-Blase als von links oder rechts kommend festlegen, je nachdem, wer der Eigentümer der Nachricht ist.Zugriff auf die Ansicht und die Daten eines Listenelements zur gleichen Zeit

public class Message { 
    public String messageText; 
    public boolean mine; 

    // ...Constructor 
} 

Innen MessageAdapter ich habe:

@Override 
public MessageHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    View view = LayoutInflater.from(parent.getContext()).inflate(this.itemResource, parent, false); 
    return new MessageHolder(this.context, view); 
} 

@Override 
public void onBindViewHolder(MessageHolder holder, int position) { 

    Message message = this.messages.get(position); 
    holder.bindMessage(message); 
} 

Ich habe folgende Tutorials wurden von Listview RecyclerView zu migrieren und bin jetzt unklar, wie die beiden Daten auf ein Element zuzugreifen und seine Ansicht zur gleichen Zeit ohne NullPointerException zu bekommen. Der Code, den ich verwenden möchten wie folgt aussieht:

Drawable background = getResources().getDrawable(message.mine ? R.drawable.bubble_right : R.drawable.bubble_left); 
background.setColorFilter(getResources().getColor(R.color.ColorPrimary), PorterDuff.Mode.SRC_IN); 

view.findViewById(R.id.message_text).setBackgroundDrawable(background); 

Allerdings, wenn ich es in onCreateViewHolder habe ich nicht herausfinden können, wie die einzelne Nachricht für den Zugriff auf das Eigentum zu überprüfen. Wenn ich es in onBindViewHolder setze habe ich message aber kann seine Ansicht nicht bekommen. Wie löse ich das?

Antwort

0

Wenn Sie von ListView zu RecyclerView wechseln, ist es sehr einfach zu verstehen.

getView() (of ListView) == onCreateViewHolder() + onBindViewHolder(); 

Wenn Sie sich erinnern wir Ansicht von getView gegeben überprüfen müssen, ist null oder nicht, und wenn es null ist, dann müssen wir auf entsprechende Ansichten, die die Daten von Instancing anders gesetzt kümmern. RecyclerView machen unser Leben einfach, die onCreateView erstellt neue Instanz der Ansicht jeder Zeile (mindestens erforderlich) und onBindViewHolder kümmert sich um die Bindung von Daten an jedes Ansichtselement.

Ich denke, jetzt sind Sie klar, warum und wie Sie mit diesen beiden Methoden von RecyclerView umgehen. Gemäß Ihrem Code sollte die Zeile view.findViewById(R.id.message_text) in Ihre ViewHolder-Klasse verschoben werden. Und die folgenden Zeilen werden in onBindViewHolder gehen

Drawable background = getResources().getDrawable(message.mine ? R.drawable.bubble_right : R.drawable.bubble_left); 
background.setColorFilter(getResources().getColor(R.color.ColorPrimary), PorterDuff.Mode.SRC_IN); 
holder.your_view.setBackgroundDrawable(background); 

Lassen Sie mich wissen, wenn Sie weitere Erläuterungen wissen wollen.

+0

Ich verstehe, dass 'onCreateViewHolder' und' onBindViewHolder' zusammen 'getView' bilden. Ich weiß jedoch nicht, wie ich dieses Wissen in meiner spezifischen Situation anwenden kann. Wie Sie in meiner Frage sehen können, würde ich gerne den Hintergrund einer 'TextView' auf' bubble_left' oder 'bubble_right' setzen, je nachdem, ob 'message.mine' den Wert true hat oder nicht. Ich weiß nicht, wie man sowohl auf "Nachricht" als auch auf seine Ansicht (um den Hintergrund einzustellen) gleichzeitig zugreifen kann. – HEATH3N

+0

Meine Antwort wurde aktualisiert. – Neo