web-dev-qa-db-ja.com

RecyclerViewの使用時に、notCreatedatasetchangedがonCreateViewHolderを呼び出しますか

トグルを使用して、2つの異なるビューを切り替えますが、同じRecyclerViewを使用します。基本的に、一度切り替えたら、RecyclerViewアダプターにonCreateViewHolder()をリコールさせたいのですが、今回は別のレイアウトアイテムファイルを使用します。

notifydatasetchanged()を使用すると、アダプタは自動的に再構築されますか?それとも別の方法がありますか?

23
AmaJayJB

ViewRecyclerViewAdaptersにも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を返すため、アダプタは作成されたすべてのビューを破棄し、すべてを再作成する必要があります。

25
marmor

RecyclerViewの場合、notifyDataSetChanged()onBindViewHolder()を呼び出します

11

RecyclerViewのレイアウトを削除および更新するには、次を呼び出すことができます

mRecyclerView.removeView(view);

OR

mRecyclerView.removeViewAt(position);

データセット内のオブジェクトを削除した後

2
streamride

この問題に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の問題のために、うまくいきました!より良い解決策があれば、幸運を祈って私たちと共有してください。グローバル変数を「静的」にすることを忘れないでください:)

0
Mujtaba Mahmood

はい、現在のデータセットは無効であり、すべてのレイアウトを再レイアウトして再バインドする必要があると想定しています。

0
Kevin Crain