Android:ビューを削除してrecyclerViewに適切に追加する

ジョン・イワシ

リストのような単純なRecyclerViewがあり、各ビューに異なるIDを設定し、最初のビューをクリックしてビューを追加し、クリックするとビューを削除します(最初のビューを期待してください)。正しく機能しないのは、ビューを削除してから別のビューを追加すると、新しいビューのIDが順序を壊してしまうことです。

アダプター

public class AddEventsAdapter extends RecyclerView.Adapter<AddEventsAdapter.ViewHolder> {

   private List<String> items = new ArrayList<>();

    public void addItem(String name) {
        items.add(name);
        notifyItemInserted(items.size() - 1);
    }

    public void removeItem(int position) {
        items.remove(position);
        notifyItemRemoved(position);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.add_event_item, parent, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
    }

    @Override
    public int getItemCount() {
        return items.size();
    }

    static int i;

    class ViewHolder extends RecyclerView.ViewHolder{

        public TextView eventName;
        public RelativeLayout theLayout;


        public ViewHolder(View itemView) {
            super(itemView);
            eventName = (TextView)itemView.findViewById(R.id.eventName);
            theLayout = (RelativeLayout)itemView.findViewById(R.id.backgroundevent);

            theLayout.setId(++i);
            eventName.setText(String.format("", i));

            theLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (v.getId() == 1){
                    addItem("");
                }else {
                    removeItem(getAdapterPosition());
                }
            }
        });
        }
    }
}

実装:

    final AddEventsAdapter AddContainer = new AddEventsAdapter();
    AddEventsRecycler.setLayoutManager(new LinearLayoutManager(this));
    AddEventsRecycler.setAdapter(AddContainer);
    AddEventsRecycler.setItemViewCacheSize(666);

    AddContainer.addItem("");

すべての行のレイアウト:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="@drawable/event_clicked_ripple"
    android:clickable="true"
    android:id="@+id/backgroundevent"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp">

    <TextView
        android:clickable="false"
        android:id="@+id/eventName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="something"
        android:layout_centerVertical="true"
        android:layout_toLeftOf="@+id/eventImage"
        android:layout_toStartOf="@+id/eventImage"
        android:layout_marginRight="10dp"/>

    <ImageButton
        android:clickable="false"
        android:id="@+id/eventImage"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:background="@drawable/oval_shape"/>

</RelativeLayout>

私の問題は、5つのビューを追加し、2番目のビューを削除してから、別のビューを追加すると、6番目のビューではなく2番目のビューが再び追加されることです。それで、ここでの問題は、ビューを削除した後にビューをリサイクルしない方法だと思いますか?

ベンシュワブ

RecyclerViewsの背後にある考え方は、指定したビューホルダーをonCreateViewHolder()同じのビューに再利用できるということviewTypeです。この振る舞いがRecyclerViewsを効率的にするものです-ビューを膨らませるのに費用がかかり、実行するのに費用がかかりますfindViewById

オーバーライドしなかったgetItemViewTypeため、RecyclerViewのビュータイプは1つだけです。つまり、ViewHolderは、多くのビューをスクロールしたり、ビューを削除/追加したりするときに、相互に自由にリサイクルできます。

では、コードで何が起こっているのでしょうか?ビュー番号2を削除すると、そのViewHolderがリサイクルされ、リサイクラービュープールに送り返されます。ビュー番号6を追加すると、リサイクラービューは番号2のリサイクルビューホルダーを使用します。したがって、onCreateViewHolder呼び出されることはありません(リサイクルする追加のビューがあったため)。ただし、onBindViewHolder 呼ばれます。したがって、ViewHolderによって表示されるデータを更新するメソッドを追加します。

 public void setData(final int position) {
    eventName.setText(String.format("", position));
    theLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (position == 1){
                addItem("");
            }else {
                removeItem(position);
            }
        }
}

onBindViewHolderでこのメソッドを呼び出します。

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
     holder.setData(position);
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Swiftを使用してiOS8で子ビューコントローラーを適切に追加する方法

分類Dev

Recyclerview Layout Managerは、Androidでスクロールした後にビューを適切な位置に表示します

分類Dev

ReactNativeでAnimatedCircularProgressを使用してビューを適切に配置する方法

分類Dev

テーブルビューセルに適切な詳細を追加する

分類Dev

Androidがマルチタスクビューに適切な情報を表示しないようにする

分類Dev

Android-forループを使用して配列にビューを追加する

分類Dev

動的にビューを追加するandroid

分類Dev

Android Studioへの移行:logcatビューをより適切に構成する方法

分類Dev

Android:RecyclerViewにビューを追加するときの奇妙な反応

分類Dev

RecyclerViewに動的にビューを追加します

分類Dev

ビューの幅を適切に相対的にする方法

分類Dev

ビューに配列の内容を適切に表示する

分類Dev

コレクションビューを適切に使用していますか?

分類Dev

Pythonを使用してJSONにデータを適切に追加する方法

分類Dev

カードビューをrecyclerviewに追加する

分類Dev

android-beacon-library (altbeacon) を使用してビーコンのスキャンを適切に停止する方法

分類Dev

NuGetを介してPropertyChanged.Fodyを適切に削除する方法

分類Dev

サブビューを削除してカスタムUITableViewCellに追加します

分類Dev

ビュー内でimageviewを適切に移動する

分類Dev

共有ビューを適切に初期化する方法は?

分類Dev

Ajaxを使用して部分ビューを動的に追加する

分類Dev

recyclerviewからすべてのカードビューを削除してから新しいカードビューを追加-同じカードビューを追加

分類Dev

Twitterアイコンを追加して適切に配置する

分類Dev

iOS:viewForHeaderInSectionのカスタムビューにスワイプして削除ボタンを追加する方法

分類Dev

Android-定期的なサービスを適切に停止する

分類Dev

重複するツリービューノードを検出して、子として適切に割り当てることができません

分類Dev

同じxmlビューを動的に追加/削除します

分類Dev

Javascript / jQueryを使用して他のJSONデータに続いてJSONデータを適切に追加する方法

分類Dev

回転後にビューステートを適切に復元する方法

Related 関連記事

  1. 1

    Swiftを使用してiOS8で子ビューコントローラーを適切に追加する方法

  2. 2

    Recyclerview Layout Managerは、Androidでスクロールした後にビューを適切な位置に表示します

  3. 3

    ReactNativeでAnimatedCircularProgressを使用してビューを適切に配置する方法

  4. 4

    テーブルビューセルに適切な詳細を追加する

  5. 5

    Androidがマルチタスクビューに適切な情報を表示しないようにする

  6. 6

    Android-forループを使用して配列にビューを追加する

  7. 7

    動的にビューを追加するandroid

  8. 8

    Android Studioへの移行:logcatビューをより適切に構成する方法

  9. 9

    Android:RecyclerViewにビューを追加するときの奇妙な反応

  10. 10

    RecyclerViewに動的にビューを追加します

  11. 11

    ビューの幅を適切に相対的にする方法

  12. 12

    ビューに配列の内容を適切に表示する

  13. 13

    コレクションビューを適切に使用していますか?

  14. 14

    Pythonを使用してJSONにデータを適切に追加する方法

  15. 15

    カードビューをrecyclerviewに追加する

  16. 16

    android-beacon-library (altbeacon) を使用してビーコンのスキャンを適切に停止する方法

  17. 17

    NuGetを介してPropertyChanged.Fodyを適切に削除する方法

  18. 18

    サブビューを削除してカスタムUITableViewCellに追加します

  19. 19

    ビュー内でimageviewを適切に移動する

  20. 20

    共有ビューを適切に初期化する方法は?

  21. 21

    Ajaxを使用して部分ビューを動的に追加する

  22. 22

    recyclerviewからすべてのカードビューを削除してから新しいカードビューを追加-同じカードビューを追加

  23. 23

    Twitterアイコンを追加して適切に配置する

  24. 24

    iOS:viewForHeaderInSectionのカスタムビューにスワイプして削除ボタンを追加する方法

  25. 25

    Android-定期的なサービスを適切に停止する

  26. 26

    重複するツリービューノードを検出して、子として適切に割り当てることができません

  27. 27

    同じxmlビューを動的に追加/削除します

  28. 28

    Javascript / jQueryを使用して他のJSONデータに続いてJSONデータを適切に追加する方法

  29. 29

    回転後にビューステートを適切に復元する方法

ホットタグ

アーカイブ