2017-01-13 14 views
0

私はフラグメント内にRecyclerViewを持っており、アイテムは選択可能です。 RvAdapterに変数int focusedItem = 0;を作成し、onBindViewHolderメソッドのholder.itemView.setSelected(focusedItem == position);を作成して解決しました。Android - RecyclerView:新しいアイテムを追加して選択します

holder.itemView.setOnClickListener(new View.OnClickListener(){ 

    @Override 
    public void onClick(View v) { 
     notifyItemChanged(focusedItem); 
     focusedItem = position; 
     notifyItemChanged(focusedItem); 
    } 
}); 

及びIは、選択された項目の背景色を変更背景としてセレクタを使用するリスト項目のXMLファイルで:これはアイテムのonClickの方法です。これは問題なく動作していますが、リサイクラビューにアイテムを追加したいのですが、アイテムを追加した後はそれほど良く機能しません。

これは私が(フラグメントクラス内)RVに項目を追加する方法です:

entries.add(0, new ...); 
rvAdapter.notifyItemInserted(0); 
recyclerView.scrollToPosition(0); 

だから私は、最初の位置にArrayListにアイテムを追加します。次に、アダプターに通知して、最初の位置にある新しい項目が挿入された後、その新しい項目にスクロールします。今度は、新しい項目が自動的に選択されるようにします。それを行う方法はありますか?私の考えはfocusedItem = 0を設定することでしたが、フラグメントクラスでこの値を編集する方法はわかりません。または、この変数を0に設定できるonItemInsertedのようなものがありますか?

答えて

2

notify..を呼び出す前に、focusedItemを0に設定すると、onBindViewHolderが呼び出され、選択されたアイテムとして表示されます。

entries.add(0, new ...); 
focusedItem = 0; 
rvAdapter.notifyItemInserted(0); 
recyclerView.scrollToPosition(0); 

EDIT:

つまり、あなたのFragmentの代わりAdapterfocusedItemを定義しましたか? Adapterに移動し、getter/setterメソッドを追加する方が良いでしょう。

0

@Roman Kolomenskiiは、focusedItem変数をRvAdapterクラスではなくフラグメントクラスに配置する考えがありました。それは良いアイデアとその働きでした。

だから私の断片クラスで私はpublic static int focusedItem = 0;を持っているし、ここで私は項目を追加コードは次のとおりです。

int oldFocusedItem = focusedItem; 
focusedItem = 0; 
rvAdapter.notifyItemInserted(0); 
rvAdapter.notifyItemChanged(oldFocusedItem+1); 
recyclerView.scrollToPosition(0); 

私は、アダプタを通知しなければならないので、最新のSelectedItemを格納する必要があり、その本項目は、+ 1(前に新しい項目があるので)、選択を緩める必要があるため変更されました。次にfocusItemを0に設定します。そして、RvAdapterクラスでは、MyFragment.focusedItemを使用して選択項目を取得します。

+0

Yeap、あなたは正しいです、選択解除の部分を忘れてしまった:) –

関連する問題