2017-02-22 2 views
0

Ich versuche einen Chat mit socket.io zu machen. Ich möchte das nur ein Vorname des Benutzers der Nachricht desselben Benutzers wird sichtbar sein.Wie versteckt man einen zweiten Namen des Benutzers der Nachricht den gleichen Benutzer in Listview?

Zum Beispiel:

 Username | Message 

item: Hans:  hello   (first message with name of user) 
item:   How are you? (second message without username) 
item: Look:  Thanks, good! 
item:   you?   (second message without username) 

Below Code funktioniert manchmal gut, manchmal falsch. Beim Scrollen einer Listenansicht ist manchmal ein zweiter Benutzername des gleichen Benutzers sichtbar, die andere Zeit ist ausgeblendet. Wie kann ich den zweiten Namen des Benutzers des gleichen Benutzers wird auch versteckt und Teiler?

Einfach Code:

package com.example.seadog.fb_dialog; 

import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 

import java.util.ArrayList; 

public class MyBaseAdapter extends BaseAdapter { 

    Context context; 
    ArrayList<ListData> items = new ArrayList(); 
    LayoutInflater inflater; 

    int id = 0; 

    public MyBaseAdapter(Context context, ArrayList items) { 
     this.context = context; 
     this.items = items; 
     inflater = LayoutInflater.from(this.context); 
    } 

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

    @Override 
    public ListData getItem(int position) { 
     return items.get(position); 
    } 

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

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

     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.list_item, parent, false); 
      mViewHolder = new MyViewHolder(convertView); 
      convertView.setTag(mViewHolder); 
     } else { 
      mViewHolder = (MyViewHolder) convertView.getTag(); 
     } 

     ListData currentListData = getItem(position); 

     mViewHolder.Title.setText(currentListData.getTitle()); 
     mViewHolder.Desc.setText(currentListData.getDescription()); 

     if (id != currentListData.getID() || position == 0) { 
      mViewHolder.Title.setVisibility(View.VISIBLE); 
     }else{ 
      mViewHolder.Title.setVisibility(View.GONE); 
     } 

     id = currentListData.getID(); 

     return convertView; 
    } 

    private class MyViewHolder { 
     TextView Title, Desc; 

     public MyViewHolder(View item) { 
      Title = (TextView) item.findViewById(R.id.txtitem); 
      Desc = (TextView) item.findViewById(R.id.descitem); 
     } 
    } 
} 

Antwort

0

Sie können es wahrscheinlich wie ein wenig ändern:

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

    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.list_item, parent, false); 
     mViewHolder = new MyViewHolder(convertView); 
     convertView.setTag(mViewHolder); 
    } else { 
     mViewHolder = (MyViewHolder) convertView.getTag(); 
    } 

    id = position > 0 ? getItem(position - 1).getID() : -1; 

    ListData currentListData = getItem(position); 

    mViewHolder.Title.setText(currentListData.getTitle()); 
    mViewHolder.Desc.setText(currentListData.getDescription()); 

    if (id == -1 && id != currentListData.getID()) { 
     mViewHolder.Title.setVisibility(View.VISIBLE); 
    } else { 
     mViewHolder.Title.setVisibility(View.GONE); 
    } 

    return convertView; 
} 

Sie können nicht sicher sein, dass die getView() wird mit aufeinanderfolgenden Positionen aufgerufen werden, wie wenn Sie sind Scrollen nach oben.

+0

'id = position> 0? getItem (position - 1) .getID(): 0; 'dies löst mein Problem und meine Bedingung geändert an 'if (id! = currentListData.getID())'. Jetzt sehe ich, dass das gute Werke sind. Wie kann ich sicher sein, dass getView() mit sequentiell aufgerufen wird? Ich muss mir sicher sein. – SeaDog

+0

'getView()' wird zur Laufzeit aufgerufen, abhängig davon, welches Listenelement erstellt/neu erstellt werden muss. Es hängt von der Benutzeraktion ab (Scrollen), Sie können niemals sicherstellen, dass es mit sequentiellen Positionen aufgerufen wird. Sie können den Code in meiner Antwort sicher verwenden. –

+1

OK, ich benutze deine Lösung. Danke! – SeaDog

Verwandte Themen