2017-07-28 1 views
0

Eh bien, j'ai un RecyclerView avec deux types de mise en page, il se présente comme suit:RecyclerView des mises en page hétérog'enes est des positions SHUFFLING

public class SearchKeywordRecycler extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

public static final int TYPE = 1, SERVICE = 2; 
private ServicesViewHolder serviceViewHolder; 
private ServiceTypeViewHolder serviceTypeViewHolder; 
private Services services; 
private Context context; 
private OnSearchItemClickListener OnSearchItemClickListener; 

public SearchKeywordRecycler(Services services, OnSearchItemClickListener OnSearchItemClickListener) { 
    this.services = services; 
    this.OnSearchItemClickListener = OnSearchItemClickListener; 
    setHasStableIds(true); 
} 

@Override 
public int getItemViewType(int position) { 
    if (services.get(position).getSerficeType() == 1) { 
     return TYPE; 
    } else if (services.get(position).getSerficeType() == 0) { 
     return SERVICE; 
    } 
    return position; 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    context = parent.getContext(); 
    LayoutInflater inflater = LayoutInflater.from(context); 
    if (viewType == TYPE) { 
     View v = inflater.inflate(R.layout.item_search_service_type, parent, false); 
     serviceTypeViewHolder = new ServiceTypeViewHolder(v); 
     return serviceTypeViewHolder; 
    } else if ((viewType == SERVICE)) { 
     View v2 = inflater.inflate(R.layout.item_search_sevice, parent, false); 
     serviceViewHolder = new ServicesViewHolder(v2); 
     return serviceViewHolder; 
    } 

    return null; 
} 

@Override 
public long getItemId(int position) { 
    return services.get(position).hashCode(); 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    Service service = services.get(position); 

    switch (getItemViewType(position)) { 
     case TYPE: 
      serviceTypeViewHolder.setData(service); 
      break; 
     case SERVICE: 
      serviceViewHolder.setData(service); 
      break; 
     default: 
    } 
} 

@Override 
public int getItemCount() { 
    return services.size(); 
} 

public interface OnSearchItemClickListener { 
    void onClickListener(int position); 
} 

class ServicesViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
    TextView txtViewService; 

    public ServicesViewHolder(View itemView) { 
     super(itemView); 
     txtViewService = ButterKnife.findById(itemView, R.id.service_name); 
    } 

    public void setData(Service service) { 
     txtViewService.setText(service.getService_name()); 
     if (service.getType_name() != null) { 
      txtViewService.setText(service.getType_name()); 

     } 
    } 

    @Override 
    public void onClick(View v) { 
     OnSearchItemClickListener.onClickListener(getAdapterPosition()); 
    } 
} 


class ServiceTypeViewHolder extends RecyclerView.ViewHolder { 
    TextView txtViewType; 

    public ServiceTypeViewHolder(View itemView) { 
     super(itemView); 
     txtViewType = ButterKnife.findById(itemView, R.id.serviceType); 
    } 

    public void setData(Service service) { 
     String name = service.getType_name(); 
     txtViewType.setText(service.getService_name()); 
    } 
    } 
} 

La question est la position des articles garder brassage tout en faisant défiler la recyclerView et je doit garder son ordre fixé dans la vue. Comme vous pouvez le remarquer, j'ai utilisé, 1- hasStableIds (true) fonction, 2- utilisé getItemId() comme suggéré à la plupart des réponses et messages Satck.

Qu'est-ce que je fais mal? Merci

Répondre

0

Le problème était que, j'ai utilisé une instance de serviceViewHolder que j'ai créée mannually pour exécuter la fonction setData() dans OnMinderHolder (titulaire ViewHolder, position int); Après l'utilisation de l'instance de support qui m'a été fournie par l'adaptateur lui-même, tout s'est bien passé car il synchronise l'instance de support correspondant à la position utilisée pour extraire l'objet du tableau de données.