2016-04-21 3 views
2

J'ai une liste de taskLists. Pour montrer la liste, j'ai utilisé recyclerview. J'ai le 1er 3 articles comme aujourd'hui, demain et plus tard dans ma liste. Je veux ajouter un séparateur après les 3 premiers éléments dans la vue recycleur. Comment puis-je faire ceci?Comment ajouter un séparateur à une position particulière à l'intérieur de recyclerview?

Adaptateur:

public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ItemViewHolder>{ 

    ArrayList<ListData> item; 
    public static final int TYPE1=1; 
    Context conext; 


    public ListAdapter(Context context, ArrayList<ListData> item) { 
     this.conext=context; 
     this.item=item; 

    } 
    public interface OnItemClickListener { 
     void onItemClick(ListData listData); 
    } 
    @Override 
    public int getItemCount() { 
     return item.size(); 

    } 
    public void remove(int position) { 
     item.remove(position); 
     notifyItemRemoved(position); 
    } 

    // @Override 
    // public int getItemViewType(int position) { 
     // return item.get(position).getExpenseType();// Assume that this return 1 0r 2 
    // } 

    @Override 
    public void onBindViewHolder(ItemViewHolder itemViewHolder,final int i) { 

     itemViewHolder.listName.setText(item.get(i).getTitle()); 

    } 

    @Override 
    public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup,int viewType) { 

     View itemView = LayoutInflater. 
       from(viewGroup.getContext()). 
       inflate(R.layout.list_layout, viewGroup, false); 
     return new ItemViewHolder(itemView,viewType); 

    } 


    public static class ItemViewHolder extends RecyclerView.ViewHolder { 

     TextView listName; 


     ItemViewHolder(View itemView, int viewType) { 
      super(itemView); 

      listName = (TextView)itemView.findViewById(R.id.listData); 

     } 
    } 
    @Override 
    public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
     super.onAttachedToRecyclerView(recyclerView); 
    } 

} 

Quelqu'un peut-il aider à ce comment puis-je mettre le séparateur après 3 éléments de la liste? Merci ..

+0

pouvez-vous partager la capture d'écran que vous voulez atteindre –

+0

http://android.amberfog.com/wp-content/uploads/2010/02/004.png ...... comme ça. après 3 éléments. @ PhanVănLinh – Sid

Répondre

2

Une solution est de définir 2 types de lignes RecyclerView (une pour la ligne normale et un pour séparateur) Une autre solution est que vous devez un Separator View dans le fond de votre custom RecycleView row xml

<View 
    android:id="@+id/separatorView" 
    android:layout_width="match_parent" 
    android:layout_height="3dp" 
    android:visible="gone" 
    android:background="@android:color/darker_gray"/> 

Puis, en bindViewHolder de votre RecyclerView.Adapter, cacher le séparateur dans la ligne normale et visible dans la ligne de séparation

@Override 
    public void bindViewHolder(ViewHolder holder, int position) { 
     if(position == separatorPosition){ 
      holder.separatorView.visible = View.VISIBLE; 
     }else{ 
      holder.separatorView.visible = View.GONE; 
     } 
    } 

Hope this aide

+0

plus simple .. Merci [email protected] Văn Linh – Sid

+0

mais à l'avenir, si votre vue séparateur est plus complexe, je suggère que vous devez utiliser la solution 1 (définir 2 types de RecyclerView). codage heureux –

+0

Non, je voulais seulement de cette façon .. :-) Merci .. @ Phan Văn Linh – Sid

2

Vous pouvez créer deux classes ViewHolder et les changer en onCreateViewHolder. Un contenant votre ligne personnalisée et d'autres comme éléments de liste personnalisée.

class ViewHolderLine extends RecyclerView.ViewHolder { //contains line 
    } 

    class ViewHolderItems extends RecyclerView.ViewHolder { //contains data 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return item.get(position).getExpenseType();// Assume that this return 1 0r 2 
    } 

    @Override 
    public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup,int viewType) { 

     switch (viewType) { 
     case 1: return new ViewHolderLine(); 
     case 2: 
      View itemView = LayoutInflater. 
      from(viewGroup.getContext()). 
      inflate(R.layout.list_layout, viewGroup, false); 
      return new ItemViewHolder(itemView,viewType); 
     } 


    } 

Vous pouvez voir la description des détails here pour plus d'informations.

3

Vous devez définir 2 types de lignes RecyclerView:

...YourRecyclerAdapter extends RecyclerView.Adapter<BaseViewHolder> 

public static final int COMMON = 1; 
public static final int SEPARATOR = 2; 

Remplacer getItemViewType méthode de votre Adapter:

@Override 
public int getItemViewType(int position) { 
    if (position%10 == 0) //each 10 row is separator (change it!) 
     return SEPARATOR; 
    else return COMMON; 
} 

Changement de méthode onCreateViewHolder de votre Adapter:

@Override 
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    if (viewType == COMMON) 
     return new ItemViewHolder(LayoutInflater.from(activity).inflate(R.layout.list_layout, parent, false)); 
    else 
     return new SeparatorHolder(LayoutInflater.from(activity).inflate(R.layout.separator_item, parent, false)); 
} 

@Override 
public void onBindViewHolder(BaseViewHolder holder, int position) { 
    if (getItemViewType(position) == COMMON) { 
      //do stuff 
    } else { 
    } 
} 

ItemViewHolder étend BaseViewHolder
SeparatorHolder étend BaseViewHolder
BaseViewHolder étend RecyclerView.ViewHolder

+0

Mais je veux afficher toute la liste ne va pas vérifier le type de vue si nous avons mis une condition? @Vladimir Kulyk – Sid

+1

@Sid de toute façon, il est correct de faire ce que vous voulez. –

1

si vous savez que vous n'allez ajouter séparateur dans les trois 1ers éléments, vous pouvez mettre une condition fondée sur l'position de l'élément, à l'intérieur onBindViewHolder.

ps: S'il vous plaît ne pas oublier d'ajouter un autre bloc après un si bloc