Android での RecyclerView の最適化

Android での RecyclerView の最適化

Android 開発において、RecyclerView は、大規模なデータ リストを表示するための効率的かつ柔軟なコントロールです。RecyclerView は複雑なデータ セットの表示によく使用されるため、特にデータ項目が多い場合には、パフォーマンスとユーザー エクスペリエンスを向上させるために最適化することが重要です。以下は、一般的に使用される RecyclerView 最適化のヒントの一部です。

  1. ViewHolder モードを使用する: RecyclerView は ViewHolder モードを使用してアイテム ビューを再利用し、メモリ オーバーヘッドとビュー作成の消費を削減します。ViewHolder はビューとデータをバインドするため、毎回新しいビューを再作成する代わりに getView() メソッドを呼び出すことで、再利用された項目ビューを取得できます。

  2. RecyclerView.Adapter の setHasStableIds(true) を使用する: データ項目に一意の ID がある場合、setHasStableIds(true) を設定すると、RecyclerView のパフォーマンスを向上させることができます。このようにして、データ セットが変更されると、RecyclerView はデータ項目の変更をより正確に判断し、データの繰り返しバインドを回避できます。

  3. DiffUtil を使用する: DiffUtil は、古いデータ セットと新しいデータ セットの違いを計算し、RecyclerView のデータを効率的に更新するのに役立つ Android サポート ライブラリのツール クラスです。DiffUtil を使用すると、不要なデータ更新やインターフェイスの再描画を回避し、リスト更新の効率を向上させることができます。

  4. ページング ロードを使用する: データ セットが非常に大きい場合は、一度に大量のデータをロードするコストを削減するためにページング ロードの使用を検討してください。リストの一番下までスクロールすると、より多くのデータが動的に読み込まれ、データ セットが小さくなり、リストの応答性が向上します。

  5. RecyclerView の setRecycledViewPool を使用する: RecyclerView の setRecycledViewPool メソッドを使用すると、ViewHolder プールを共有し、複数の RecyclerView で ViewHolder を再利用し、ビューの作成と破棄を減らし、スクロール パフォーマンスを向上させることができます。

  6. 過剰な描画を避ける: アイテム ビューのレイアウトで過度のネストや複雑な描画操作を避けて、アイテム ビューを軽量に保ち、レイアウトのレンダリングのオーバーヘッドを軽減します。

  7. 画像読み込みの最適化: RecyclerView に大量の画像が含まれている場合は、画像読み込みライブラリ (Glide、Picasso など) を使用して画像を非同期に読み込み、画像のスケーリングや圧縮などの最適化操作を実行してメモリ使用量を削減し、メモリ使用量を増やすことができます。画像の読み込み速度。

  8. RecyclerView.LayoutManager の setItemPrefetchEnabled を使用する: RecyclerView.LayoutManager の setItemPrefetchEnabled メソッドを使用すると、スクロール中にアイテム ビューの次のバッチをプリロードし、事前に新しいアイテム ビューを準備してスクロールのスムーズさを向上させることができます。

上記の最適化手法を組み合わせると、RecyclerView のパフォーマンスとユーザー エクスペリエンスを効果的に向上させることができます。開発プロセス中に、さまざまなニーズやシナリオのパフォーマンス要件を満たすために、特定の状況に基づいて適切な最適化戦略を選択できます。

コード例

それでは、簡単なコード例を見て、いくつかの最適化を行って Android で RecyclerView を使用する方法を説明しましょう。

まず、activity_main.xmlレイアウト ファイルに RecyclerView を配置して、データ リストを表示します。

<!-- activity_main.xml -->

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

Item次に、 RecyclerView 内の各データ項目を表すデータ クラスを作成します。

// Item.java

public class Item {
    
    
    private String name;

    public Item(String name) {
    
    
        this.name = name;
    }

    public String getName() {
    
    
        return name;
    }
}

次に、データ項目の表示を管理するための RecyclerView のアダプタ クラスを作成します。

// MyAdapter.java

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;

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

    private List<Item> itemList;

    public MyAdapter(List<Item> itemList) {
    
    
        this.itemList = itemList;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    
    
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    
    
        Item item = itemList.get(position);
        holder.nameTextView.setText(item.getName());
    }

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

    public static class ViewHolder extends RecyclerView.ViewHolder {
    
    
        TextView nameTextView;

        public ViewHolder(@NonNull View itemView) {
    
    
            super(itemView);
            nameTextView = itemView.findViewById(R.id.nameTextView);
        }
    }
}

上記のアダプターでは、ViewHolder パターンを使用して項目ビューを再利用し、onBindViewHolder()メソッド内のビューにデータをバインドします。

item_layout.xml次に、 RecyclerView 内の各データ項目のレイアウトを表すレイアウト ファイルを作成します。

<!-- item_layout.xml -->

<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/nameTextView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="18sp"
    android:padding="16dp" />

最後に、MainActivity で RecyclerView を初期化し、アダプターをセットアップします。

// MainActivity.java

import android.os.Bundle;

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

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

public class MainActivity extends AppCompatActivity {
    
    

    private RecyclerView recyclerView;
    private MyAdapter adapter;
    private List<Item> itemList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化RecyclerView和数据列表
        recyclerView = findViewById(R.id.recyclerView);
        itemList = new ArrayList<>();
        for (int i = 1; i <= 100; i++) {
    
    
            itemList.add(new Item("Item " + i));
        }

        // 设置LayoutManager和Adapter
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        adapter = new MyAdapter(itemList);
        recyclerView.setAdapter(adapter);
    }
}

上の例では、100 個のデータ項目を含む単純な RecyclerView を作成しました。RecyclerView のパフォーマンスを最適化するために、ViewHolder モードを使用して項目ビューを再利用し、アダプターに必要なデータ バインディングを実装しました。同時に、RecyclerView の LayoutManager として LinearLayoutManager を使用して、データ項目のレイアウトを管理します。これらの最適化により、大量のデータを効率的にリスト表示できるようになり、ユーザーエクスペリエンスが向上します。

おすすめ

転載: blog.csdn.net/QYgujingjing/article/details/132091065