1. ホーム
  2. android

[解決済み] AndroidのRecyclerViewでnotifyItemRemovedまたはnotifyDataSetChangedを使用する。

2023-04-30 20:41:26

質問

RecyclerViewを使用して表示するカードのリストを作成しています。各カードには、リストからそのカードを削除するためのボタンがあります。

私は notifyItemRemoved() を使ってRecyclerViewのカードを削除すると、アイテムは削除され、アニメーションも正常に行われますが、リストのデータが正しく更新されません。

もしその代わりに notifyDataSetChanged() に切り替えると、リスト内のアイテムは正しく削除・更新されますが、カードはアニメーションしません。

どなたかnotifyItemRemoved()の使用経験があり、notifyDataSetChangedと異なる挙動をする理由をご存知の方はいらっしゃいませんか?

以下は、私が使用しているコードの一部です。

private List<DetectedIssue> issues = new ArrayList<DetectedIssue>();

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    // - get element from your dataset at this position
    // - replace the contents of the view with that element
    if(position >0){
        RiskViewHolder riskHolder = (RiskViewHolder)holder;
        final int index = position - 1;
        final DetectedIssue anIssue = issues.get(index);

        riskHolder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    int index = issues.indexOf(anIssue);
                    issues.remove(anIssue);
                    notifyItemRemoved(index);

                    //notifyDataSetChanged();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

@Override
public int getItemCount() {
    return (issues.size()+1);
}

どのように解決するのですか?

pskink が示唆したように、私の場合は (index+1) となるはずでした。 notifyItemRemoved(index+1) というのは、おそらく一番上のインデックスを予約しているからです。 position=0 をヘッダーに使用します。