2016-05-01 5 views
0
  • 正しい位置の値を取得する方法。
  • RecyclerViewのアダプタでnotifyDataSetChangedが2-3回呼び出された後、onBindViewHolderの位置が変更されています。
  • しかし、スクロールの位置は同じです。

getItemViewTypeで別のビューを設定しています。クリックの行にRecyclerViewは、2-3のnotifyDataSetChangedが呼び出された後にonBindViewHolderの位置値を変更します。

@Override 
public int getItemViewType(int position) { 
    if (totalCartSize > productServiceSize) { 
     if (position < productServiceSize) { 
      return PRODUCT_SERVICE_TYPE; 
     } else if (position >= productServiceSize && position < totalCartSize) { 
      return PROJECT_TYPE; 
     } 
    } else { 
     return PRODUCT_SERVICE_TYPE; 
    } 
    return super.getItemViewType(position); 
} 

私は再びサービスを押すことで、さわやかためcallBackListenerを持っていますが、コールバックで私が原因誤った位置onBindViewholder間違った値を取得しています。

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    if (holder instanceof ProductServiceViewHolder) { 
     setProductServiceView((ProductServiceViewHolder) holder, holder.getAdapterPosition()); 
    } else if (holder instanceof ProjectViewHolder) { 
     setProjectView((ProjectViewHolder) holder, position); 
    } 
} 
  • アビシェーク

答えて

0

まあ、onBindViewHolderはそれで何も間違っていない、それだけ表示値を変更するロジックを行います。あなたが問題に思うのは、RecyclerViewの仕組みが完全に理解できていないということです。

  1. RecyclerViewは、彼らが新しいViewHolderを作成し、それはこの表示項目について
  2. getItemViewType経由)ビュータイプを取得し、それぞれの目に見えるためgetItemCount
  3. 経由項目の合計数を取得したり、すでに作成をリサイクル1つ(タイプに基づいて)
  4. 各項目にonBindViewHolderとデータを設定します。したがって、目に見えるアイテムが4つある場合、onBindViewHolderは4回呼び出されます。 このメソッドは、アイテムが表示されるときに各アイテムに対して呼び出されます。または、notifyDataSetChangedを使用してデータが変更されたことをアダプタに通知すると、このメソッドが呼び出されます。これには何も問題はありません、あなたはそのタイプに問題があると思います。

ところで、あなたは、アダプタを防ぐために、いくつかの他のより具体的な方法を持っているときに、データの変更:

- final void notifyItemChanged(int position) 
Notify any registered observers that the item at position has changed. 
- final void notifyItemChanged(int position, Object payload) 
Notify any registered observers that the item at position has changed with an optional payload object. 
- final void notifyItemInserted(int position) 
Notify any registered observers that the item reflected at position has been newly inserted. 
- final void notifyItemMoved(int fromPosition, int toPosition) 
Notify any registered observers that the item reflected at fromPosition has been moved to toPosition. 
- final void notifyItemRangeChanged(int positionStart, int itemCount) 
Notify any registered observers that the itemCount items starting at position positionStart have changed. 
- final void notifyItemRangeChanged(int positionStart, int itemCount, Object payload) 
Notify any registered observers that the itemCount items starting at positionpositionStart have changed. 
- final void notifyItemRangeInserted(int positionStart, int itemCount) 
Notify any registered observers that the currently reflected itemCount items starting at positionStart have been newly inserted. 
- final void notifyItemRangeRemoved(int positionStart, int itemCount) 
Notify any registered observers that the itemCount items previously located at positionStart have been removed from the data set. 
- final void notifyItemRemoved(int position) 
Notify any registered observers that the item previously located at position has been removed from the data set. 

公式RecyclerView.Adapterドキュメントhere

+0

こんにちはヒューゴ、私の見解はまだ同じ位置ですが、私は別のポジション価値を得ています。 – abhishek

+0

@abhishek –

+0

@Hugo Gresse私はここで同様の問題を抱えている可能性があります:http://stackoverflow.com/questions/43531900/android-how-to-fix-recyclerview-onbindviewholder私はどのように修正するかに関する考えやアイデアを感謝します。 – AJW

関連する問題