Android コントロールの知識ポイント - RecyclerView (ネットワーク全体で最も詳細な説明)

背景: 筆者は Android の Bluetooth 通信を開発しており、Bluetooth デバイスを検索して動的に表示する必要があります.このとき、関連する適切なビュー コントロールを選択する必要があります.私も開発途上にあり、いろいろ調べてみたところ、以下のように多くのデータがまとめられています。

序章

RV と呼ばれる RecyclerView は、ListView と GridView の拡張バージョンとして表示されます. その目的は、限られた画面に大量のコンテンツを表示することです. したがって、RecyclerView の多重化メカニズムの実現はその中核部分です. RecyclerView は、Android アプリケーション開発で最も広く使用されているコントロールの 1 つと言えます。最新の Android バージョンでは、パッケージは次のようにインポートされます。
implementation 'com.android.support:recyclerview-v7:27.1.1'

画像

build.gradle を変更した後は、忘れずに今すぐ同期してください。

1. RecyclerView 機能紹介

  • さまざまなスタイルのレイアウトを簡単に実装するために、さまざまな LayoutManager が提供されています
  • 部分的なリフレッシュをサポート
  • View の再利用が実現し、if (convertView == null) のような実装が不要になり、リサイクルのメカニズムがより完璧になりました
  • アイテムの追加と削除のアニメーション効果を簡単に実現できます
  • ドラッグアンドドロップ、サイドスライド削除などの機能を簡単に実装できます。
  • 通常の上下左右スワイプ
  • 上下左右にスライドするグリッド効果
  • 滝の上下すべりと左右すべり
  • 分割線を追加
  • 最後の項目の区切り線を削除
  • クリックイベントを追加
  • アイテムの追加と削除
  • アニメーションを追加
  • 複数のレイアウト
  • 下に引っ張って更新、上に引っ張ってロード
  • ヘッダー レイアウトとフッター レイアウトを追加する
  • ドラッグ&ドロップで並べ替え、スライドで削除
  • ページングの読み込み、プルアップの読み込み、フッター レイアウトの追加 DEMO

ここでは、筆者は主に Bluetooth デバイスの動的表示を使用して、行ごとにリスト形式で表示し、左から右にスライドさせます。

第二に、長所と短所

アドバンテージ

名前からわかるように、RecyclerView はビューをリサイクルして再利用し、RecyclerView はビューのみをリサイクルして再利用し、他は自分で設定でき、1 つのクラスで 1 つの機能を実装し、高度な分離を実現します

画像

欠点

RecyclerView はクリックや長押しイベントの制御が面倒なので自分で書く必要がある

この場所にアダプターBaseQuickAdapterを使えば、この場所の空きを大幅に補うことができます

3.知識の蓄え

RecylerView は高度に分離されています. 1 つのクラスが 1 つの関数を実装します. クラスを使用する前にクラスを理解する必要があります.

  • レイアウトマネージャー

レイアウト マネージャーにはデフォルトで LinearLayoutManager、GridLayoutManager、StaggeredGridLayoutManager の 3 つのタイプが用意されており、それぞれ ListView、GridView、フロー レイアウトのリスト効果を実現できます。

  • アダプタ

アダプター、表示するデータを適応させる方法は、RecyclerView.Adapter インターフェースにメソッドを実装することでデータ適応を実現します。
同時に、RecyclerView のアダプターにより、パフォーマンスを最適化するために Viewholder を使用する必要があり、getView メソッドを自分で記述する必要はなく、Viewholder を記述するだけで済み、View の再利用はカプセル化されています。

  • アイテム装飾

装飾の英語の意味は装飾の意味ですが、ここで拡張すると、RecyclerView のインターフェイスの装飾にも関連している必要があります。よく目にするのは、分割線やアイテムの間隔の構成です

  • スナップヘルパー

各アイテムを 1 画面に表示し、ページ単位で表示する場合は、このクラスを設定することですぐに実現できます。

  • アイテムアニメーター

このクラスは、アイテムの追加と削除のアニメーションを実現できます. 設定したくない場合は、デフォルトの効果も非常に優れています.

  • ビューホルダー

子アイテムのレイアウトを生成する

RecyclerView RecyclerView 関連のクラスは引き続きメソッドを知る必要があります

//1 RecyclerView.setLayoutManager();

//2 RecyclerView.setAdapter();

//3 RecyclerView.setItemAnimator();

//4 RecyclerView.addItemDecoration;

  • setLayoutManager:

必須、RV のレイアウト マネージャを設定して、RV の表示スタイルを決定します。一般的に使用される線形レイアウト マネージャー (LinearLayoutManager)、グリッド レイアウト マネージャー (GridLayoutManager)、ウォーターフォール フロー レイアウト マネージャー (StaggeredGridLayoutManager)。

  • セットアダプター:

必須、RV のデータ アダプタを設定します。データが変更された場合、notifier として RV にデータの変更を通知し、リストの更新操作を実行します。

  • setItemAnimator:

オプションで、アイテムのアニメーションを RV に設定します。

  • addItemDecoration:

オプションで、RV に Item のデコレータを設定します。Item の分割線を設定するためによく使用されます。

4.ステップを使用する

RecyclerView.Adapter アダプター

使用手順:

  • RecyclerView の作成は通常、xml で構成されます

  • コードでプロパティを設定する

    • レイアウト スタイルの設定を決定する layoutManager
    • データ ソースを決定する - RecyclerView.Adapter インターフェイスでメソッドを実装するアダプタを定義します。
  • RecyclerView は、インターフェイスのメソッドを介してデータにアクセスします

  • RecyclerView.ViewHolder を継承するクラスを作成して再利用する


  •   アダプタのインターフェイス メソッドを   書き直し
       ます

  • アイテム デコレーターを設定する addItemDecoration

    • システムが提供する DividerItemDecoration 分割線
    • ItemDecorationを継承するクラスを自作してonDrawかonDrawOver、getItemOffsetを書き換える
  • 各アイテムが SnapHelper、LinearSnapHelper、PagerSnapHelper を表示する画面を表示する場合

BaseQuickAdapter アダプター

使用手順:

  • RecyclerView の作成は通常、xml で構成されます

  • コードでプロパティを設定する

    • レイアウト スタイル設定を決定する
    • データ ソースを決定する - RecyclerView.Adapter インターフェイスでメソッドを実装するアダプタを定義します。
  • RecyclerView は、インターフェイスのメソッドを介してデータにアクセスします

  • BaseQuickAdapter を継承するクラスを作成して再利用する

  • convert メソッドを書き直す

  • クリックイベントの設定など一連の操作が可能

  • setItemAnimator はアニメーションを設定し、次に setAdapter に進み、これで終わりです

#5. 例の説明

(1) RecyclerView.Adapter アダプターケース

1.一覧表示を実現する

  • activity_main.xml

    このうち、RecyclerView はシステム SDK に組み込まれていないため、その完全なパッケージ名パスを記述する必要があります。

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    /></LinearLayout>

画像

  • item_test.xml

    これは、データの一部を表示するために使用されるアイテムです

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:foreground="?attr/selectableItemBackground"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:padding="16dp">


        <TextView
            android:id="@+id/textView2"
            android:layout_width="378dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            />
    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#EEE" />
</LinearLayout>

ここでのビューは分割線に相当するものですが、主な理由は、この方が直接法よりもはるかに単純であり、使いやすいからです。

プレビュー

次にエンティティクラスのitemdataを書きますが、急いで書いたので最初の文字を大文字にするのを忘れていました。

  • itemdata.java
package com.example.recyclerview;
/**
 * @author W凯
 * @data 2022/9/28
 * @fuction 实体类
 */
public class itemdata   {
    private String name;
    public itemdata(String name ){
        this.name = name;
    }
    public String getName() {
        return name;
    }
}

ここでは、Textview というコンポーネントしかないので、変数を 1 つだけ書きましたが、画像を挿入したり、他のことを書きたい場合は、さらにいくつか追加することができます。

以下はアダプターの内容ですが、今表示されているのは、クリックイベントは書かれていませんが、データは単純に表示され、テキストは表示できるということです〜

  • ItemAdapt.java

    package com.example.recyclerview;
    
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    
    import androidx.annotation.NonNull;
    import androidx.recyclerview.widget.RecyclerView;
    
    import java.util.List;
    
    /**
     * @author W凯
     * @data 2022/9/28
     * @fuction 实体类
     */
    
    public class ItemAdapt  extends RecyclerView.Adapter<ItemAdapt.ViewHolder>{
    private List<itemdata> nmitemdata;//数据源
        //ItemAdapt的构造方法,加入了数据源参数,在构造的时候赋值给nmitemdata
        public ItemAdapt(List<itemdata> mitemdata) {
            nmitemdata = mitemdata;
        }
        //静态内部类, 每个条目对应的布局
        static class ViewHolder extends RecyclerView.ViewHolder{
            TextView names;
            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                names = (TextView) itemView.findViewById(R.id.textView2);
    
    
            }
        }
        //用于创建ViewHolder实例,并把加载的布局传入到ViewHolder的构造函数去
        @NonNull
        @Override
        public ItemAdapt.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_test, parent, false);
            ViewHolder holder = new ViewHolder(view);
            return holder;
        }
        //是用于对子项的数据进行赋值,会在每个子项被滚动到屏幕内时执行。position得到当前项的实例
        @Override
        public void onBindViewHolder(@NonNull ItemAdapt.ViewHolder holder, int position) {
            itemdata Itemata = nmitemdata.get(position);
            holder.names.setText(Itemata.getName());
        }
        //返回RecyclerView的子项数目
        @Override
        public int getItemCount() {
            return nmitemdata.size();
        }
    
    
    }
    

ここでの一般的な考え方は

1. データ ソースを渡す

2. onCreateViewHolder が呼び出され、サブビュー ビューを作成してインスタンス化し、

3. 次に、それを ViewHolder として使用して、サブビューのコントロールをインスタンス化します

4. onBindViewHolder はデータ バインディングを実行し、ほとんどのコントロールは値の割り当てを実行します

5.後で、作者はクリック効果を実感します〜

これらのメソッドの機能の一部を以下に詳しく説明します

(1) 内部クラス ViewHolder を定義し、RecyclerView.ViewHolder を継承する。渡される View パラメーターは、通常、RecyclerView の子の最も外側のレイアウトです。私の理解では、それをインスタンス化することであり、Javaコードで写真や名前を追加するなど、後で簡単に操作できます。

(2)onCreateViewHolder():

  • ViewHolder作成時のコールバック関数
  • ViewGroup 親と int viewType を渡す
  • マイホルダーに戻る

私の理解では、ViewHolder インスタンスを作成し、読み込まれたレイアウトをコンストラクターに渡し、ViewHolder インスタンスを返します。つまり、この xml を見つけてインスタンス化し、後でこの xml のコントロールのいくつかのプロパティを変更します。

(3)onBindViewHolder()

  • ViewHolderバインド時のコールバック関数
  • カスタム内部クラスのホルダーと int 位置を渡します

各サブアイテムが画面にスクロールされるときに実行されるサブアイテムのデータを割り当てるために使用されます。position は、現在のアイテムの Fruit インスタンスを取得します。位置は、配列のようにリスト内の項目の添え字として理解でき、各項目には独自の ID があります。

(4)getItemCount()

RecyclerView の子の数。

  • MainActivity.java

    package com.example.recyclerview;
    
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;
    
    import android.os.Bundle;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
        private List<itemdata> mitemdata = new ArrayList<>();
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            intintest();//初始化数据
            RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);//将其实例化
            LinearLayoutManager layoutManager = new LinearLayoutManager(this);
            //竖直方向
            layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
            //设置item显示方法
            recyclerView.setLayoutManager(layoutManager);
            //将数据源传入到适配器里
            ItemAdapt adapter = new ItemAdapt(mitemdata);
            //显示item
            recyclerView.setAdapter(adapter);
        }
    
        /**
         * 初始化
         */
        public void intintest() {
            for (int i = 0; i < 10; i++) {
                itemdata item = new itemdata("W凯");
                mitemdata.add(item);
            }
        }
    }
    

コードには注釈があります。自分で確認できます。作成者の場所は bluetooth 表示に使用され、さまざまな bluetooth デバイスを行ごとに表示します。

実行結果

ここに画像の説明を挿入

2.クリックイベントを実装する

RecyclerView にはリストビューの OnItemClickListener や OnItemLongClickListener のようなクリックメソッドがないため、単体で作成するしかありません。

最初の方法は、アダプターでクリック効果を実装します

ItemAdapt クラスの onBindViewHolder() を変更します。

   //是用于对子项的数据进行赋值,会在每个子项被滚动到屏幕内时执行。
    @Override
    public void onBindViewHolder(@NonNull ItemAdapt.ViewHolder holder, @SuppressLint("RecyclerView") int position) {
        itemdata Itemata = nmitemdata.get(position);
        holder.names.setText(Itemata.getName());
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.getInstance(), "" + holder.names.getText()+"  "+position, Toast.LENGTH_SHORT).show();
            }
        });
    }

ここに画像の説明を挿入

効果を達成する

ここに画像の説明を挿入

クリック選択効果を実現する方法

実際、これは難しいことではありませんが、インターネット上で非常に複雑な文章を書いている人がいて、すべて1つずつ読んでいます。

ここに画像の説明を挿入

  • ItemAdapt 修正コード
package com.example.recyclerview;

import android.annotation.SuppressLint;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

/**
 * @author W凯
 * @data 2022/9/28
 * @fuction 实体类
 */

public class ItemAdapt  extends RecyclerView.Adapter<ItemAdapt.ViewHolder>{
    private List<itemdata> nmitemdata;//数据源
    private Context myContext;
    private OnItemClickListener myClickListener;
    public   View mview;

    public   boolean status = false;
    //ItemAdapt的构造方法,加入了数据源参数,在构造的时候赋值给nmitemdata
    public ItemAdapt(List<itemdata> mitemdata) {
        nmitemdata = mitemdata;
    }
    //静态内部类, 每个条目对应的布局
    static class ViewHolder extends RecyclerView.ViewHolder{
        TextView names;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            names = (TextView) itemView.findViewById(R.id.textView2);


        }
    }
    //用于创建ViewHolder实例,并把加载的布局传入到ViewHolder的构造函数去
    @NonNull
    @Override
    public ItemAdapt.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_test, parent, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }
    //是用于对子项的数据进行赋值,会在每个子项被滚动到屏幕内时执行。position得到当前项的实例
    @Override
    public void onBindViewHolder(@NonNull ItemAdapt.ViewHolder holder, @SuppressLint("RecyclerView") int position) {
        itemdata Itemata = nmitemdata.get(position);
        holder.names.setText(Itemata.getName());
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @SuppressLint("ResourceAsColor")
            @Override
            public void onClick(View v) {

                if(status){
                    mview.setBackgroundResource(R.color.white);
                    Log.e("TAG","运行中");
                }
                v.setBackgroundColor(R.color.purple_200);
                mview = v;
                status = true;

                Toast.makeText(MainActivity.getInstance(), "" + holder.names.getText()+"  "+position, Toast.LENGTH_SHORT).show();
            }
        });
//        holder.itemView.setOnClickListener(v -> {
                Toast.makeText(myContext, "" + position, Toast.LENGTH_SHORT).show();
//            myClickListener.OnClick(position);
//        });
    }
    //返回RecyclerView的子项数目
    @Override
    public int getItemCount() {
        return nmitemdata.size();
    }
    public void setOnItemClickListener(OnItemClickListener myClickListener) {
        this.myClickListener = myClickListener;
    }

    interface OnItemClickListener{
        void OnClick(int position);
    }


}

私の考えは、最後のビューを保存することです。次のビューをクリックすると、前のビューの色を復元できます. ステータス状態を使用して、最初にクリックしたときに前のビューを保存します. これが実装されていない場合, エラーが報告され、値は割り当てられません.その mview に。

効果を達成する

ここに画像の説明を挿入

ここに画像の説明を挿入

2番目の方法は、Activitymainでクリック効果を実現します

ここは変更点が多いので、変更したクラスコードを全て載せます

  • アイテム適応
package com.example.recyclerview;

import android.annotation.SuppressLint;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

/**
 * @author W凯
 * @data 2022/9/28
 * @fuction 实体类
 */

public class ItemAdapt  extends RecyclerView.Adapter<ItemAdapt.ViewHolder>{
    private List<itemdata> nmitemdata;//数据源
    private Context myContext;
    private OnItemClickListener myClickListener;
    //ItemAdapt的构造方法,加入了数据源参数,在构造的时候赋值给nmitemdata
    public ItemAdapt(List<itemdata> mitemdata) {
        nmitemdata = mitemdata;
    }
    //静态内部类, 每个条目对应的布局
    static class ViewHolder extends RecyclerView.ViewHolder{
        TextView names;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            names = (TextView) itemView.findViewById(R.id.textView2);


        }
    }
    //用于创建ViewHolder实例,并把加载的布局传入到ViewHolder的构造函数去
    @NonNull
    @Override
    public ItemAdapt.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_test, parent, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }
    //是用于对子项的数据进行赋值,会在每个子项被滚动到屏幕内时执行。position得到当前项的实例
    @Override
    public void onBindViewHolder(@NonNull ItemAdapt.ViewHolder holder, @SuppressLint("RecyclerView") int position) {
        itemdata Itemata = nmitemdata.get(position);
        holder.names.setText(Itemata.getName());
//        holder.itemView.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                Toast.makeText(MainActivity.getInstance(), "" + holder.names.getText()+"  "+position, Toast.LENGTH_SHORT).show();
//            }
//        });
        holder.itemView.setOnClickListener(v -> {
//                Toast.makeText(myContext, "" + position, Toast.LENGTH_SHORT).show();
            myClickListener.OnClick(position);
        });
    }
    //返回RecyclerView的子项数目
    @Override
    public int getItemCount() {
        return nmitemdata.size();
    }
    public void setOnItemClickListener(OnItemClickListener myClickListener) {
        this.myClickListener = myClickListener;
    }

    interface OnItemClickListener{
        void OnClick(int position);
    }


}
  • 主な活動
package com.example.recyclerview;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends AppCompatActivity {
    private List<itemdata> mitemdata = new ArrayList<>();
    private static MainActivity instance;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        instance = this;//上下文
        intintest();//初始化数据
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);//将其实例化
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        //竖直方向
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        //设置item显示方法
        recyclerView.setLayoutManager(layoutManager);
        //将数据源传入到适配器里
        ItemAdapt adapter = new ItemAdapt(mitemdata);
        //显示item
        recyclerView.setAdapter(adapter);
        adapter.setOnItemClickListener(position -> {
            Toast.makeText(this, "" + position, Toast.LENGTH_SHORT).show();
        });
    }

    /**
     * 初始化
     */
    public void intintest() {
        for (int i = 0; i < 10; i++) {
            itemdata item = new itemdata("W凯");
            mitemdata.add(item);
        }
    }
    public static MainActivity getInstance(){
        return instance;
    }
}

ここで、トーストしたところにそのようなコードを書いたことがわかります

myClickListener.OnClick(position);


MyClickListener は、自分で作成して以前に定義したプライベート OnItemClickListener myClickListener によって呼び出されるインターフェースのメソッドを呼び出します。

    public void setOnItemClickListener(OnItemClickListener myClickListener) {
    
    
        this.myClickListener = myClickListener;
    }

パブリック メソッドは、onBindViewHolder 内の holder.itemView.setOnClickListener を呼び出すために、OnClick メソッドを myClickListener にアタッチすることです。

ここでの私の理解では、onBindViewHolder の setOnClickListener メソッドが onClick メソッドを呼び出して対応する位置を取得し、取得された位置は setOnItemClickListener public メソッドを通じて Activitymain で取得できるということです ~

効果を達成する

ここに画像の説明を挿入

3. RecyclerView の表示効果を変更する

(1)横スクロール

Activitymain のコードを変更する
ここに画像の説明を挿入

//水平方向
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);

私の item_test レイアウトは LinearLayout レイアウトであるため、横方向に表示するにはサイズを変更する必要があります. 必要に応じて別のレイアウトを選択できます.

ここに画像の説明を挿入

効果を達成する

ここに画像の説明を挿入

(2) GridLayoutManager (グリッドレイアウト)

MainActivity.java の変更

MainActivity.java を変更して配置します

LinearLayoutManager layoutManager = new LinearLayoutManager(this);

layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);

に変更

GridLayoutManager layoutManager = new GridLayoutManager(this,5);

GridLayoutManager (コンテキスト コンテキスト、int spanCount)

パラメータの意味:

コンテキスト: 現在のコンテキストは、リソースへのアクセスに使用されます。

spanCount int: グリッド内の列数 (グリッド内の列数)

コードの場所を変更する

ここに画像の説明を挿入

GridLayoutManager layoutManager = new GridLayoutManager(this,3);

item_test レイアウトのサイズを変更し、固定値のレイアウト サイズを設定するのも同じ理由です。

ここに画像の説明を挿入

効果を達成する

あとで他を使う場合は追加しますが、基本はここまでです基本はほぼRecyclerView.Adapterアダプタに関するところです。

(2) BaseQuickAdapter アダプターケース

この利点は、コードの重複を減らすことができることです

アダプタの書き換えが必要

  • アイテム適応
package com.example.recyclerview;

import android.annotation.SuppressLint;
import android.view.View;

import androidx.annotation.NonNull;

import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;

import java.util.List;

public class ItemAdapts extends BaseQuickAdapter<itemdata, BaseViewHolder> {
    public ItemAdapts(int layoutResId, List<itemdata> data) {
        super(layoutResId, data);
    }
    @Override
    protected void convert(@NonNull BaseViewHolder baseViewHolder, itemdata itemdata) {
        baseViewHolder.setText(R.id.textView2,itemdata.getName());
    }
}

このアダプターで書かれたコードは少なすぎて、とても感動的で使いやすい

Activitymain の変更点を見てみましょう

  • アクティビティメイン
package com.example.recyclerview;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.chad.library.adapter.base.BaseQuickAdapter;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends AppCompatActivity {
    private List<itemdata> mitemdata = new ArrayList<>();
    private static MainActivity instance;
    ItemAdapts mItemAdapts;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        instance = this;//上下文
        intintest();//初始化数据
//        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);//将其实例化
//        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
//        //竖直方向
//        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
//        //水平方向
//     //   layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
//     //   GridLayoutManager layoutManager = new GridLayoutManager(this,3);
//        //设置item显示方法
//        recyclerView.setLayoutManager(layoutManager);
//        //将数据源传入到适配器里
//        ItemAdapt adapter = new ItemAdapt(mitemdata);
//        //显示item
//        recyclerView.setAdapter(adapter);
        adapter.setOnItemClickListener(position -> {
            Toast.makeText(this, "" , Toast.LENGTH_SHORT).show();
        });

        RecyclerView recyclerView =  findViewById(R.id.recycler_view);//将其实例化
        mItemAdapts = new ItemAdapts(R.layout.item_test,mitemdata);
        mItemAdapts.setOnItemClickListener((adapter, view, position) -> {
            Log.e("TAG","");
        });
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        //启用动画
        mItemAdapts.setAnimationEnable(true);
        //设置动画方式
        mItemAdapts.setAnimationWithDefault(BaseQuickAdapter.AnimationType.SlideInRight);
        // rvDevice.addItemDecoration(new GridSpacingItemDecoration(spanCount, ScreenUtils.dip2px(this, 2), false));
        recyclerView.setAdapter(mItemAdapts);


    }

    /**
     * 初始化
     */
    public void intintest() {
        for (int i = 0; i < 10; i++) {
            itemdata item = new itemdata("W凯");
            mitemdata.add(item);
        }
    }
    public static MainActivity getInstance(){
        return instance;
    }
}

ここにデータが書き込まれているので、アニメーション表示を開始するのも非常に便利です.作成者が表示用に bluetooth デバイスを使用している場合、デバイスは動的に表示され、かなり見栄えがします.これは主にソース コードに依存し、クリックevent は、処理するメソッドと同じです。

ランニング効果はここでは表示されません、同じです〜

6. 遭遇した問題

まだ遭遇していない

7. まとめ

基本的な RecycleView の導入はおそらくここで終了です. 常に変化しているため, 著者は引き続き更新します. 著者は私が使用するものを要約します. それは私自身の理解に依存します. 2 つのアダプターは 2 つ目のアダプターを好みます.少ない、めまいがしにくい

8. ソースコードアドレス

ダウンロードアドレス
csdn: https://download.csdn.net/download/jdaljd/86800058
gitee: https://gitee.com/W-200091/RecyclerView.git

おすすめ

転載: blog.csdn.net/jdaljd/article/details/127462418