2016-11-21 2 views

Antwort

0

Sie können: nach Zustand Für zB

verwenden Sie es Ihrer Meinung nach für die Bindung

+0

Also muss ich eine Struktur mit allen Elementen von zwei Listen erstellen? Recht ? – z85510

+0

Ja, in den Adapter müssen Sie beide Arten von Elementen in einer Liste Ihrer Wahl gespeichert haben und in der OnBindViewHolder nach dem Objekttyp füllen Sie die Layout-Attribute –

+0

Vielen Dank, Sie sparen mich – z85510

0

So müssen Sie in Ihrer Liste zwei verschiedene Arten von Gegenständen haben? Verwenden Sie RecyclerView anstelle von ListView, da es bereits ViewHolderPattern implementiert. Im Adapter gibt es die Methode .onBindViwHolder(), die int-Variable empfängt und den Elementtyp rezirkuliert.

public void getView() 
{ 
    if(some condition) 
{ 
view=LayoutInflator.from(context).inflate(R.layout.layout1,parent,null); 

//bind the related elements in the view accordingly; 
} 
else 
{ 

view=LayoutInflator.from(context).inflate(R.layout.layout2,parent,null); 

//bind the related elements in the view accordingly; 
} 
} 
+0

Ich benutze RecyclerView aber ich wusste nicht, wie ich zwei Arten von Struktur an seinen Adapter senden kann – z85510

+0

create b ase Klasse und erweitern Sie es für jede Ihrer Struktur. Übergeben Sie den Verweis auf die Basisklasse an Ihren Adapter. –

0

es auch in Listenansicht getan werden kann, alles, was Sie tun müssen, ist Blick in getView() Verfahren von baseadapter aufblasen Zeigen Sie mehrere Typen von ListView-Zeilenlayout in Ihrem RecyclerView an - Sie brauchen nicht mehrere Adapter

Sie müssen die Methoden getItemCount und getItemViewType der Recycleransicht überschreiben und angeben, wie viele Typen Sie verwenden möchten Anzeige in der Liste Blick auf diese: RecyclerView item count

Hier ist ein Beispiel:

der Adapter:

public class NotificationsAdapter extends RecyclerView.Adapter<MultipleRowViewHolder> { 

private LayoutInflater inflater = null; 

// notification list 
private List<Notification> notificationList; 

public NotificationsAdapter(Context context, List<Notification> multipleRowModelList){ 
    this.notificationList = multipleRowModelList; 
    inflater = LayoutInflater.from(context); 
} 

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

    View view = null; 

    if (viewType == NotificationType.Lick.getValue()) 
     view = inflater.inflate(R.layout.lick_row_item, parent, false); 
    else if (viewType == NotificationType.Comment.getValue()) 
     view = inflater.inflate(R.layout.comment_list_row, parent, false); 
    else if (viewType == NotificationType.ViewMyProfile.getValue()) 
     view = inflater.inflate(R.layout.view_my_profile_list_row, parent, false); 
    else // if notification is not of the first three types get the view_my_profile_list_row layout 
     view = inflater.inflate(R.layout.view_my_profile_list_row, parent, false); 

    return new MultipleRowViewHolder(view, viewType); 
} 
@Override 
public void onBindViewHolder(MultipleRowViewHolder holder, int position) { 

    try { 
     // display enum type as title 
     holder.titleTV.setText(NotificationType.toNotificationType(Integer.valueOf(notificationList.get(position).getType())).name()); 
     // display pretty date 
     holder.actionTimeTV.setText(TimeUtils.getPrettyTimeDifference(notificationList.get(position).getActionTime())); 
     holder.sourceUserNameTV.setText(notificationList.get(position).getSourceUserName()); 
    }catch (Exception e) 
    { 
     Log.e(NotificationReader.TAG,e.getMessage()); 
    } 
} 
@Override 
public int getItemCount() { 
    return notificationList.size(); 
} 

@Override 
public int getItemViewType(int position) { 

    Notification multipleRowModel = notificationList.get(position); 

    if (multipleRowModel != null) 
     return Integer.valueOf(multipleRowModel.getType()); 

    return super.getItemViewType(position); 
} 

Das Datenmodell:

public class MultipleRowViewHolder extends RecyclerView.ViewHolder { 

public TextView titleTV; 
public TextView sourceUserNameTV; 
public TextView actionTimeTV; 

private int type; 

public MultipleRowViewHolder(View itemView, int type) { 
    super(itemView); 

    titleTV = (TextView)itemView.findViewById(R.id.titleTV); 
    sourceUserNameTV = (TextView)itemView.findViewById(R.id.sourceUserNameTV); 
    actionTimeTV = (TextView)itemView.findViewById(R.id.actionTimeTV); 

    this.type = type; 

} 

}