1

の無限のデータ読み込みを実装していRecyclerViewます。最後のアイテムが表示されることをソフトウェアが検出すると、新しいアイテムをダウンロードし、次の関数を呼び出します (メイン スレッドで実行します)。

int visibleItemCount = numberOfItemsPerRow;
int pastVisiblesItems = ((GridLayoutManager)recyclerView.getLayoutManager()).findLastVisibleItemPosition();
int totalItemCount = mLayoutManager.getItemCount();
if (loading) {
    if ((visibleItemCount+pastVisiblesItems) >= totalItemCount) {
    .
    .
    .

    //After downloading data

    loading = false;
    getActivity().runOnUiThread(new Runnable() {
        public  void  run() {
            mAdapter.notifyDataSetChanged();
        }
    });
}

ただし、すばやくスクロールして、新しいデータを受信する前に最後のアイテムが表示されると、notifyDataSetChanged()機能しません。新しいデータのレンダリングを強制するために、もう一度上下にスクロールした場合にのみ、これらの新しいデータが表示されます。

何が間違っているかについて何か考えはありますか?

4

1 に答える 1

0

あなたが試すことができます

        RecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {  
                super.onScrolled(recyclerView, dx, dy);
            }
        });

編集:

あなたが使用する正しい位置を決定するためにそれを使用するために、私はあなたの位置が適切な条件を反映していないに違いありません:

  • ビューが空の場合、最後に表示される位置は -1 になります
  • ビューが 1 つの要素を取得すると、位置は 0 になります
  • アダプタ数は 1 になります

編集2:

私は同様のアプローチを得ました:

  • キューにデータを保持しているスレッドを検索しています
  • オンデマンドでキューが空になる
  • アダプターを入手しました

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

  • アダプターでリストを取得しました:

    List<T> _itemList;

    • add(item)/ addAll(collection)/clear()項目リストを管理するメソッドを取得しました

    • 3 つのオーバーライドされたメソッド:

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

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

      @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {}

  • そしてホルダー:

    public class ViewHolder extends RecyclerView.ViewHolder {}

  • を介してデータを管理してAdapter.add();い ます。clear();次に、UI スレッドで Runnable として呼び出しAdapter.notifidatasetChanged();ます。あなたのような問題はありません。

どのライブラリを使用していますか?

私のものは:

  • appcompat-v7:22.2.0'
  • サポート-v4:22.2.0'
  • デザイン:22.2.0'
  • recyclerview-v7:22.2.0'
  • cardview-v7:22.2.0'
于 2015-07-02T23:37:17.380 に答える