トグルを使用して、2つの異なるビューを切り替えますが、同じRecyclerView
を使用します。基本的に、一度切り替えたら、RecyclerView
アダプターにonCreateViewHolder()
をリコールさせたいのですが、今回は別のレイアウトアイテムファイルを使用します。
notifydatasetchanged()
を使用すると、アダプタは自動的に再構築されますか?それとも別の方法がありますか?
View
RecyclerView
のAdapter
sにも2つのタイプが必要でした。1つは「通常」モード用で、もう1つは複数選択モード用です。
したがって、getItemViewType
をオーバーライドして、すべてのビューに対してアダプタにonCreateViewHolder
を強制的に呼び出させることができます。
これをAdapter
コードに追加します。
public void setActionMode(ActionMode actionMode) {
this.actionMode = actionMode;
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
return (actionMode == null ? 0 : 1);
}
これをViewHolder
に追加します。
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
if (viewType == 0) {
view = inflater.inflate(R.layout.layout_1, parent, false);
} else {
view = inflater.inflate(R.layout.layout_2, parent, false);
}
...
}
ViewType
にいるときは別のActionMode
を返すため、アダプタは作成されたすべてのビューを破棄し、すべてを再作成する必要があります。
RecyclerView
の場合、notifyDataSetChanged()
はonBindViewHolder()
を呼び出します
RecyclerView
のレイアウトを削除および更新するには、次を呼び出すことができます
mRecyclerView.removeView(view);
OR
mRecyclerView.removeViewAt(position);
データセット内のオブジェクトを削除した後
この問題に6時間以上費やしましたが、成功しませんでした。最終的に!!!私はアダプターにグローバル変数を設定し、ビューをリストからグリッド(私の場合)に切り替えるたびに設定する必要がありました。このアプローチは面白いものでしたが、静的なものとして実行するのを忘れていました!!だから私の解決策はあなたの解決策に関連している可能性があります。試してみてうまくいくことを願ってください。
public static int mCurrentViewType;
次にgetItemType()をオーバーライドします
@Override
public int getItemViewType(int position) {
return mCurrentViewType;
}
私のtoggleItemViewTypeメソッド:
public void toggleItemViewType () {
if (mCurrentViewType == LIST_ITEM){
mCurrentViewType = GRID_ITEM;
} else {
mCurrentViewType = LIST_ITEM;
}
}
私は別のクラスから変数にアクセスしていますが、これは正しくありませんが、今のところ、onCreateViewHolderの問題のために、うまくいきました!より良い解決策があれば、幸運を祈って私たちと共有してください。グローバル変数を「静的」にすることを忘れないでください:)
はい、現在のデータセットは無効であり、すべてのレイアウトを再レイアウトして再バインドする必要があると想定しています。