2016-03-28 6 views
2

RecyclerViewの各アイテムには、OPEN、LOADING、CLOSEDの3つの状態を持つボタンがあります。RecyclerView getAdapterPosition()はコールバックで-1を返し、アイテムの新しい外観を表示できません

最初はすべてのボタンがOPEN状態です。ボタンをクリックすると、状態がLOADINGに変更され、ネットワークコールがバックグラウンドで実行されます。ネットワークコールが成功した後、ボタンの状態をCLOSEDに変更する必要があります。

は、だから私のアダプタで、私は次のように使用:

holder.button.setOnClickListener(v -> { 
    holder.state = LOADING; 
    notifyItemChanged(holder.getAdapterPosition()); /* 1 */ 
    callNetwork(...,() -> { 
     /* this is the callback that runs on the main thread */ 
     holder.state = CLOSED; 
     notifyItemChanged(holder.getAdapterPosition()); /* 2 */ 
    }); 
}); 

getAdapterPosition()は私に正しい位置を与えるのでLOADING状態が常に/* 1 */で正しく可視化されます。

getAdapterPosition/* 2 */)は常に-1を返すため、ボタンのCLOSED状態は視覚化されません。

この場合、getAdapterPosition()が間違っている場合があります。

コールバックでアイテムの外観を更新するにはどうすればよいですか? docsから

+0

だけ 'getAdapterPosition()を'使用。なぜあなたはそこにホルダーが必要ですか? – Raghunandan

+2

@Raghunandan getAdapterPositionは、ViewHolderのメソッドです。私は何か見落としてますか? – yuku

+0

あなたのビューホルダーにクリックリスナーがあります。 viewholderクラスのonClickListenerを実装し、そこにクリックリスナーを設定してください – Raghunandan

答えて

6

:あなたは次の レイアウトパスするまで、notifyDataSetChanged()呼ばれてきた場合は、このメソッドの戻り値はNO_POSITION

NO_POSITIONが一定であるだろうということ

注意その値は-1です。これはなぜここで-1の戻り値を得ているのかを説明するかもしれない。

いずれにしても、基礎となるデータセットのモデルの位置を見つけてnotifyItemChanged(int position)と呼ぶのはなぜですか?モデルをホルダーのフィールドとして保存することができます。例えば

public class MyHolder extends RecyclerView.ViewHolder { 

    private Model mMyModel; 

    public MyHolder(Model myModel) { 
     mMyModel = myModel; 
    } 

    public Model getMyModel() { 
     return mMyModel; 
    } 
} 

holder.button.setOnClickListener(v -> { 
    holder.state = LOADING; 
    notifyItemChanged(holder.getAdapterPosition()); 
    callNetwork(...,() -> { 
     /* this is the callback that runs on the main thread */ 
     holder.state = CLOSED; 
     int position = myList.indexOf(holder.getMyModel()); 
     notifyItemChanged(position); 
    }); 
}); 
+1

はい、yigit boyarのrecyclerviewアニメーションサンプルには、** int pos = getAdapterPosition();があります。 if(pos!= RecyclerView.NO_POSITION){//何かを実行してからnotifyItemChanged(pos)}を実行します。このhttps://www.youtube.com/watch?v=imsr8NrIAMsを見ているトピックには関係しませんが – Raghunandan

関連する問題