2017-07-28 3 views
0

まあシャッフルされて、私は次のように見える、2つのレイアウトタイプのRecyclerViewを持っている:RecyclerViewは、位置に

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()); 
    } 
    } 
} 

問題はアイテムの位置がrecyclerViewをスクロールしながらシャッフルおくと、私はする必要がありますその順序をビューに固定しておきます。

1- hasStableIds(true)関数 2つのgetItemId()は、Satckの回答と投稿のほとんどに示唆されているように使用されています。

私は間違っていますか?ありがとう

答えて

0

問題は、私が手動で作成したserviceViewHolderインスタンスを使用して、OnMinderHolder(ViewHolder holder、int position)でsetData()関数を実行したことです。

アダプター自体によってもたらされたホルダーインスタンスを使用した後、データ配列からオブジェクトを取得するために使用された位置に一致するホルダーインスタンスを同期させるので、すべて正常に機能しました。

関連する問題