web-dev-qa-db-ja.com

androidでのrecyclerViewの遅延読み込み

Androidで遅延読み込みrecyclerViewを実装する方法を知っている人はいますか?私はAndroidを初めて使用しましたが、これを理解する方法がわかりません。

8
Beauty

EndlessRecyclerViewを使用できます

概要一般的なアプリケーション機能は、ユーザーがアイテムをスクロールするときに、より多くのアイテムを自動的にロードすることです(無限スクロール)。これは、ユーザーが最後に到達する前に残りのアイテムのしきい値を超えたら、より多くのデータのリクエストをトリガーすることによって行われます。

ListView、GridView、RecyclerView(ListViewの後継)のアプローチは、ここに記載されています。無限スクロールを実装するために必要な情報を提供するためにRecyclerViewのLayoutManagerを渡す必要があることを除いて、どちらもコードは似ています。

どちらの場合も、スクロールを実装するために必要な情報には、リスト内の最後の表示可能なアイテムの決定や、最後のアイテムに到達する前にさらに多くのデータのフェッチを開始するための何らかのタイプのしきい値が含まれます。このデータは、外部ソースからデータをいつ読み込むかを決定するために使用できます。 エンドレススクロールの外観を提供するには、ユーザーがリストの最後に到達する前にデータをフェッチすることが重要です。したがって、しきい値を追加しますより多くのデータを追加する必要性を予測するのに役立ちます。

ListViewまたはGridViewでの実装
すべてのAdapterView(ListViewやGridViewなど)は、ユーザーがコレクションをスクロールするたびにトリガーされるOnScrollListenerイベントへのバインドをサポートしています。このシステムを使用して、OnScrollListenerを拡張する独自のクラスを作成することにより、ほとんどのユースケースをサポートする基本的なEndlessScrollListenerを定義できます。

import Android.widget.AbsListView; 

public abstract class EndlessScrollListener implements AbsListView.OnScrollListener {
    // The minimum number of items to have below your current scroll position
    // before loading more.
    private int visibleThreshold = 5;
    // The current offset index of data you have loaded
    private int currentPage = 0;
    // The total number of items in the dataset after the last load
    private int previousTotalItemCount = 0;
    // True if we are still waiting for the last set of data to load.
    private boolean loading = true;
    // Sets the starting page index
    private int startingPageIndex = 0;

    public EndlessScrollListener() {
    }

    public EndlessScrollListener(int visibleThreshold) {
        this.visibleThreshold = visibleThreshold;
    }

    public EndlessScrollListener(int visibleThreshold, int startPage) {
        this.visibleThreshold = visibleThreshold;
        this.startingPageIndex = startPage;
        this.currentPage = startPage;
    }


    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 
        {
        // If the total item count is zero and the previous isn't, assume the
        // list is invalidated and should be reset back to initial state
        if (totalItemCount < previousTotalItemCount) {
            this.currentPage = this.startingPageIndex;
            this.previousTotalItemCount = totalItemCount;
            if (totalItemCount == 0) { this.loading = true; } 
        }
        // If it's still loading, we check to see if the dataset count has
        // changed, if so we conclude it has finished loading and update the current page
        // number and total item count.
        if (loading && (totalItemCount > previousTotalItemCount)) {
            loading = false;
            previousTotalItemCount = totalItemCount;
            currentPage++;
        }

        // If it isn't currently loading, we check to see if we have breached
        // the visibleThreshold and need to reload more data.
        // If we do need to reload some more data, we execute onLoadMore to fetch the data.
        if (!loading && (firstVisibleItem + visibleItemCount + visibleThreshold) >= totalItemCount ) {
            loading = onLoadMore(currentPage + 1, totalItemCount);
        }
    }

    // Defines the process for actually loading more data based on page
    // Returns true if more data is being loaded; returns false if there is no more data to load.
    public abstract boolean onLoadMore(int page, int totalItemsCount);

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        // Don't take any action on changed
    }
}

これは抽象クラスであり、これを使用するには、この基本クラスを拡張し、onLoadMoreメソッドを定義して実際に新しいデータを取得する必要があることに注意してください。 EndlessScrollListenerを拡張するアクティビティ内で匿名クラスを定義し、それをAdapterViewにバインドできます。例えば:

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ... the usual 
        ListView lvItems = (ListView) findViewById(R.id.lvItems);
        // Attach the listener to the AdapterView onCreate
        lvItems.setOnScrollListener(new EndlessScrollListener() {
          @Override
          public boolean onLoadMore(int page, int totalItemsCount) {
              // Triggered only when new data needs to be appended to the list
              // Add whatever code is needed to append new items to your AdapterView
              loadNextDataFromApi(page); 
              // or loadNextDataFromApi(totalItemsCount); 
              return true; // ONLY if more data is actually being loaded; false otherwise.
          }
        });
    }


   // Append the next page of data into the adapter
   // This method probably sends out a network request and appends new data items to your adapter. 
   public void loadNextDataFromApi(int offset) {
      // Send an API request to retrieve appropriate paginated data 
      //  --> Send the request including an offset value (i.e `page`) as a query parameter.
      //  --> Deserialize and construct new model objects from the API response
      //  --> Append the new data objects to the existing set of items inside the array of items
      //  --> Notify the adapter of the new items made with `notifyDataSetChanged()`
   }
}

スクロールすると、ユーザーがvisibleThresholdを超えるとonLoadMoreメソッドがトリガーされるため、アイテムは自動的に入力されます。このアプローチはGridViewでも同じように機能し、リスナーはページとtotalItemsCountの両方へのアクセスを許可して、ページ付けとオフセットベースのフェッチの両方をサポートします。

RecyclerViewでの実装onLoadMore()メソッドの実装を必要とするインターフェースEndlessRecyclerViewScrollListenerを定義することにより、RecyclerViewで同様のアプローチを使用できます。 RecyclerViewでアイテムの配置場所をレンダリングし、スクロールを管理するLayoutManagerは、アダプターに対する現在のスクロール位置に関する情報を提供します。このため、LayoutManagerが使用しているインスタンスを渡して、必要な情報を収集し、いつより多くのデータをロードするかを確認する必要があります。 RecyclerViewの無限のページネーションを実装するには、次の手順が必要です。
RecyclerViewに無限のページネーションを実装するには、次の手順が必要です。
1。 EndlessRecyclerViewScrollListener.Javaをアプリケーションにコピーします。
2。 RecyclerViewでaddOnScrollListener(...)を呼び出して、無限のページ分割を有効にします。 EndlessRecyclerViewScrollListenerのインスタンスを渡して、リストを埋めるために新しいページをロードする必要があるときに起動するonLoadMoreを実装します。
3。前述のonLoadMoreメソッド内で、ネットワーク要求を送信するか、別のソースからロードすることにより、追加の項目をアダプターにロードします。

手順2と3のスクロールイベントの処理を開始するには、アクティビティまたはフラグメントでaddOnScrollListener()メソッドを使用し、次に示すように、レイアウトマネージャーを使用してEndlessRecyclerViewScrollListenerのインスタンスを渡す必要があります。

public class MainActivity extends Activity {
    // Store a member variable for the listener
    private EndlessRecyclerViewScrollListener scrollListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       // Configure the RecyclerView
       RecyclerView rvItems = (RecyclerView) findViewById(R.id.rvContacts);
       LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
       rvItems.setLayoutManager(linearLayoutManager);
       // Retain an instance so that you can call `resetState()` for fresh searches
       scrollListener = new EndlessRecyclerViewScrollListener(linearLayoutManager) {
           @Override
           public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {
               // Triggered only when new data needs to be appended to the list
               // Add whatever code is needed to append new items to the bottom of the list
               loadNextDataFromApi(page);
           }
      };
      // Adds the scroll listener to RecyclerView
      rvItems.addOnScrollListener(scrollListener);
  }

  // Append the next page of data into the adapter
  // This method probably sends out a network request and appends new data items to your adapter. 
  public void loadNextDataFromApi(int offset) {
      // Send an API request to retrieve appropriate paginated data 
      //  --> Send the request including an offset value (i.e `page`) as a query parameter.
      //  --> Deserialize and construct new model objects from the API response
      //  --> Append the new data objects to the existing set of items inside the array of items
      //  --> Notify the adapter of the new items made with `notifyItemRangeInserted()`
  }
}

https://github.com/codepath/Android_guides/wiki/Endless-Scrolling-with-AdapterViews-and-RecyclerView

6

Minsdkの特定のバージョンは必要ないので、これはより良いと思います

ステップ1:インターフェースを作成

interface caller{
void call();
}

ステップ2:RecycleViewで発信者を作成する

ステップ3:チェックは最後の項目ですか?方法?

in on Recyclerview on onBindViewHolder

if (position==items.size()-1){// its a last item
           callbacker.call();
}

ステップ4:リサイクラービューを作成するアクティビティで、定義および
リサイクラビューコンストラクタに渡す

callbacker call{
recyclerParamerList.addAll(ItemList items());
youradapter.notifyDataSetChanged();
}
0
MobiNiqoW