android - RecyclerView সঙ্গে অবিরাম তালিকা বাস্তবায়ন কিভাবে?




listview android-recyclerview (20)

আমি লোডমোর রিসাইক্লিয়ার ভিউ তৈরি করেছি আব্দুল আজিজ নূর উত্তর দিয়ে

LoadMoreRecyclerView

public class LoadMoreRecyclerView extends RecyclerView  {

    private boolean loading = true;
    int pastVisiblesItems, visibleItemCount, totalItemCount;
    //WrapperLinearLayout is for handling crash in RecyclerView
    private WrapperLinearLayout mLayoutManager;
    private Context mContext;
    private OnLoadMoreListener onLoadMoreListener;

    public LoadMoreRecyclerView(Context context) {
        super(context);
        mContext = context;
        init();
    }

    public LoadMoreRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        init();
    }

    public LoadMoreRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mContext = context;
        init();
    }

    private void init(){
        mLayoutManager = new WrapperLinearLayout(mContext,LinearLayoutManager.VERTICAL,false);
        this.setLayoutManager(mLayoutManager);
        this.setItemAnimator(new DefaultItemAnimator());
        this.setHasFixedSize(true);
    }

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

        if(dy > 0) //check for scroll down
        {
            visibleItemCount = mLayoutManager.getChildCount();
            totalItemCount = mLayoutManager.getItemCount();
            pastVisiblesItems = mLayoutManager.findFirstVisibleItemPosition();

            if (loading)
            {
                if ( (visibleItemCount + pastVisiblesItems) >= totalItemCount)
                {
                    loading = false;
                    Log.v("...", "Call Load More !");
                    if(onLoadMoreListener != null){
                        onLoadMoreListener.onLoadMore();
                    }
                    //Do pagination.. i.e. fetch new data
                }
            }
        }
    }

    @Override
    public void onScrollStateChanged(int state) {
        super.onScrollStateChanged(state);
    }

    public void onLoadMoreCompleted(){
        loading = true;
    }

    public void setMoreLoading(boolean moreLoading){
        loading = moreLoading;
    }

    public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) {
        this.onLoadMoreListener = onLoadMoreListener;
    }
}

WrapperLinearLayout

public class WrapperLinearLayout extends LinearLayoutManager
{
    public WrapperLinearLayout(Context context, int orientation, boolean reverseLayout) {
        super(context, orientation, reverseLayout);
    }

    @Override
    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
        try {
            super.onLayoutChildren(recycler, state);
        } catch (IndexOutOfBoundsException e) {
            Log.e("probe", "meet a IOOBE in RecyclerView");
        }
    }
}

// মত এটি এক্সএমএল যোগ করুন

<your.package.LoadMoreRecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</your.package.LoadMoreRecyclerView>

OnCreate বা উপর দেখুন

mLoadMoreRecyclerView = (LoadMoreRecyclerView) view.findViewById(R.id.recycler_view);
mLoadMoreRecyclerView.setOnLoadMoreListener(new OnLoadMoreListener() {
            @Override
            public void onLoadMore() {
                callYourService(StartIndex);
            }
        });

callYourService

private void callYourService(){
    //callyour Service and get response in any List

    List<AnyModelClass> newDataFromServer = getDataFromServerService();
    //Enable Load More
    mLoadMoreRecyclerView.onLoadMoreCompleted();

    if(newDataFromServer != null && newDataFromServer.size() > 0){
            StartIndex += newDataFromServer.size();

            if (newDataFromServer.size() < Integer.valueOf(MAX_ROWS)) {
                    //StopLoading..
                   mLoadMoreRecyclerView.setMoreLoading(false);
            }
    }
    else{
            mLoadMoreRecyclerView.setMoreLoading(false);
            mAdapter.notifyDataSetChanged();
    }
}

আমি ListView থেকে ListView পরিবর্তন করতে চাই। আমি ব্যবহারকারীর তালিকার শেষে স্ক্রোল করা কিনা তা নির্ধারণ করতে OnScrollListener onScroll ব্যবহার করতে চাই।

কোন ব্যবহারকারী যদি তালিকার শেষে স্ক্রোল করে তবে আমি কীভাবে একটি REST পরিষেবা থেকে নতুন ডেটা আনতে পারি?


@ কুশালকে ধন্যবাদ এবং এইভাবে আমি এটি প্রয়োগ করেছি

private boolean loading = true;
int pastVisiblesItems, visibleItemCount, totalItemCount;

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() 
{
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) 
    {
        if(dy > 0) //check for scroll down
        {
            visibleItemCount = mLayoutManager.getChildCount();
            totalItemCount = mLayoutManager.getItemCount();
            pastVisiblesItems = mLayoutManager.findFirstVisibleItemPosition();

            if (loading) 
            {
                if ( (visibleItemCount + pastVisiblesItems) >= totalItemCount) 
                {
                    loading = false;
                    Log.v("...", "Last Item Wow !");
                    //Do pagination.. i.e. fetch new data
                }
            }
        }
    }
});

যোগ করতে ভুলবেন না

LinearLayoutManager mLayoutManager;
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);

আমার জন্য, এটা খুব সহজ:

     private boolean mLoading = false;

     mList.setOnScrollListener(new RecyclerView.OnScrollListener() {

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

            int totalItem = mLinearLayoutManager.getItemCount();
            int lastVisibleItem = mLinearLayoutManager.findLastVisibleItemPosition();

            if (!mLoading && lastVisibleItem == totalItem - 1) {
                mLoading = true;
                // Scrolled to bottom. Do something here.
                mLoading = false;
            }
        }
    });

অ্যাসিঙ্ক্রোনাস কাজগুলির সাথে সতর্ক থাকুন: অ্যাসলোড্রোনাস কাজগুলির শেষে mLoading পরিবর্তন করা আবশ্যক। এটা সহায়ক হবে আশা করি!


আমি আমার onBindViewHolder ক্লাসের onBindViewHolder পদ্ধতিতে এই যুক্তিটি ব্যবহার করে একটি অসীম স্ক্রোলিং ধরন বাস্তবায়ন অর্জন করেছি।

    if (position == mItems.size() - 1 && mCurrentPage <= mTotalPageCount) {
        if (mCurrentPage == mTotalPageCount) {
            mLoadImagesListener.noMorePages();
        } else {
            int newPage = mCurrentPage + 1;
            mLoadImagesListener.loadPage(newPage);
        }
    }

এই কোডটি যখন RecyclerView শেষ আইটেমটি পায় তখন এটি বর্তমান পৃষ্ঠায় এবং কলব্যাকগুলি একটি ইন্টারফেসে বৃদ্ধি করে যা API থেকে আরো ডেটা লোড করার জন্য এবং অ্যাডাপ্টারে নতুন ফলাফল যুক্ত করার জন্য দায়ী।

এই স্পষ্ট না হলে আমি আরো সম্পূর্ণ উদাহরণ পোস্ট করতে পারেন?


আমি ব্যবহৃত LayoutManager (উদাহরণস্বরূপ, scrollVerticallyBy() ) প্রসারিত করার চেষ্টা করব এবং scrollVerticallyBy() পদ্ধতিকে ওভাররাইড scrollVerticallyBy() । প্রথমত, আমি প্রথমে super কল করব এবং তারপরে ফেরত পূর্ণসংখ্যা মান পরীক্ষা করব। মান 0 সমান হলে তল বা শীর্ষ সীমানা পৌঁছে যায়। তারপরে আমি কোন সীমানা পৌঁছানো এবং প্রয়োজন হলে আরো তথ্য লোড করতে খুঁজে বের করতে findLastVisibleItemPosition() পদ্ধতিটি ব্যবহার findLastVisibleItemPosition() । শুধু একটি ধারণা।

উপরন্তু, আপনি ওভারস্ক্রোল এবং "লোডিং" নির্দেশক প্রদর্শন করে এমন পদ্ধতি থেকে এমনকি আপনার মানটি ফেরত দিতে পারেন।


এই নামযুক্ত প্যাগিনেটের জন্য লাইব্রেরি ব্যবহার করা সহজ। ListView এবং RecyclerView উভয় (লিনিয়ার এলয়েট, গ্রিড লাউট এবং স্ট্যাগগেড গ্রিডলাউট) সমর্থন করে।

এখানে গীথুব প্রকল্পটির github.com/MarkoMilos/Paginate


এখানে AsyncListUtil ব্যবহার করে আমার সমাধানটি ওয়েবে বলেছে: মনে রাখবেন যে এই ক্লাসটি ডাটা লোড করতে একক থ্রেড ব্যবহার করে, তাই এটি ডিস্কের মতো মাধ্যমিক সঞ্চয়স্থান থেকে তথ্য লোড করার জন্য উপযুক্ত তবে নেটওয়ার্ক থেকে নয়। কিন্তু আমি তথ্য পড়া এবং জরিমানা কাজ Odata ব্যবহার করছি। আমি আমার উদাহরণ তথ্য সংস্থা এবং নেটওয়ার্ক পদ্ধতি মিস্। আমি শুধুমাত্র উদাহরণ অ্যাডাপ্টার অন্তর্ভুক্ত।

public class AsyncPlatoAdapter extends RecyclerView.Adapter {

    private final AsyncPlatoListUtil mAsyncListUtil;
    private final MainActivity mActivity;
    private final RecyclerView mRecyclerView;
    private final String mFilter;
    private final String mOrderby;
    private final String mExpand;

    public AsyncPlatoAdapter(String filter, String orderby, String expand, RecyclerView recyclerView, MainActivity activity) {
        mFilter = filter;
        mOrderby = orderby;
        mExpand = expand;
        mRecyclerView = recyclerView;
        mActivity = activity;
        mAsyncListUtil = new AsyncPlatoListUtil();

    }

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

        // Create a ViewHolder to find and hold these view references, and
        // register OnClick with the view holder:
        return new PlatoViewHolderAsync(itemView, this);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        final Plato item = mAsyncListUtil.getItem(position);
        PlatoViewHolderAsync vh = (PlatoViewHolderAsync) holder;
        if (item != null) {
            Integer imagen_id = item.Imagen_Id.get();
            vh.getBinding().setVariable(BR.plato, item);
            vh.getBinding().executePendingBindings();
            vh.getImage().setVisibility(View.VISIBLE);
            vh.getProgress().setVisibility(View.GONE);
            String cacheName = null;
            String urlString = null;
            if (imagen_id != null) {
                cacheName = String.format("imagenes/imagen/%d", imagen_id);
                urlString = String.format("%s/menusapi/%s", MainActivity.ROOTPATH, cacheName);
            }
            ImageHelper.downloadBitmap(mActivity, vh.getImage(), vh.getProgress(), urlString, cacheName, position);
        } else {
            vh.getBinding().setVariable(BR.plato, item);
            vh.getBinding().executePendingBindings();
            //show progress while loading.
            vh.getImage().setVisibility(View.GONE);
            vh.getProgress().setVisibility(View.VISIBLE);
        }
    }

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

    public class AsyncPlatoListUtil extends AsyncListUtil<Plato> {
        /**
         * Creates an AsyncListUtil.
         */
        public AsyncPlatoListUtil() {
            super(Plato.class, //my data class
                    10, //page size
                    new DataCallback<Plato>() {
                        @Override
                        public int refreshData() {
                            //get count calling ../$count ... odata endpoint
                            return countPlatos(mFilter, mOrderby, mExpand, mActivity);
                        }

                        @Override
                        public void fillData(Plato[] data, int startPosition, int itemCount) {
                            //get items from odata endpoint using $skip and $top
                            Platos p = loadPlatos(mFilter, mOrderby, mExpand, startPosition, itemCount, mActivity);
                            for (int i = 0; i < Math.min(itemCount, p.value.size()); i++) {
                                data[i] = p.value.get(i);
                            }

                        }
                    }, new ViewCallback() {
                        @Override
                        public void getItemRangeInto(int[] outRange) {
                            //i use LinearLayoutManager in the RecyclerView
                            LinearLayoutManager layoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
                            outRange[0] = layoutManager.findFirstVisibleItemPosition();
                            outRange[1] = layoutManager.findLastVisibleItemPosition();
                        }

                        @Override
                        public void onDataRefresh() {
                            mRecyclerView.getAdapter().notifyDataSetChanged();
                        }

                        @Override
                        public void onItemLoaded(int position) {
                            mRecyclerView.getAdapter().notifyItemChanged(position);
                        }
                    });
            mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    onRangeChanged();
                }
            });
        }
    }
}

এখানে StaggeredGridLayoutManager ব্যবহার করে যারা আমার বাস্তবায়ন, এটা আমার জন্য কাজ করে।

 private class ScrollListener extends RecyclerView.OnScrollListener {
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

        firstVivisibleItems = mLayoutManager.findFirstVisibleItemPositions(firstVivisibleItems);

        if(!recyclerView.canScrollVertically(1) && firstVivisibleItems[0]!=0) {
            loadMoreImages();
        }

    }

    private boolean loadMoreImages(){
        Log.d("myTag", "LAST-------HERE------");
        return true;
    }
}

কোটলিন এর এক্সটেনশান ফাংশন শক্তি দিয়ে, কোড অনেক বেশি মার্জিত দেখতে পারেন। আপনি চান যে কোন জায়গায় এই রাখুন (আমি একটি ExtensionFunctions.kt ফাইলের ভিতরে এটি আছে):

/**
 * WARNING: This assumes the layout manager is a LinearLayoutManager
 */
fun RecyclerView.addOnScrolledToEnd(onScrolledToEnd: () -> Unit){

    this.addOnScrollListener(object: RecyclerView.OnScrollListener(){

        private val VISIBLE_THRESHOLD = 5

        private var loading = true
        private var previousTotal = 0

        override fun onScrollStateChanged(recyclerView: RecyclerView,
                                          newState: Int) {

            with(layoutManager as LinearLayoutManager){

                val visibleItemCount = childCount
                val totalItemCount = itemCount
                val firstVisibleItem = findFirstVisibleItemPosition()

                if (loading && totalItemCount > previousTotal){

                    loading = false
                    previousTotal = totalItemCount
                }

                if(!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)){

                    onScrolledToEnd()
                    loading = true
                }
            }
        }
    })
}

এবং তারপর এটি এভাবে ব্যবহার করুন:

youRecyclerView.addOnScrolledToEnd {
    //What you want to do once the end is reached
}

এই সমাধান কুশল শর্মা এর উত্তর উপর ভিত্তি করে। যাইহোক, এটি একটি বিট ভাল কারণ:

  1. এটি onScrollStateChanged পরিবর্তে onScrollStateChanged ব্যবহার করে। এটি ভাল কারণ onScroll প্রতিটি সময় onScroll যে কোনও ধরণের আন্দোলন থাকে, যখন onScrollStateChanged শুধুমাত্র তখনই বলা হয় যখন onScrollStateChanged এর অবস্থা পরিবর্তিত হয়। onScrollStateChanged ব্যবহার করে আপনার CPU সময় বাঁচাবে এবং ফলস্বরূপ ব্যাটারিটি সংরক্ষণ করবে।
  2. যেহেতু এটি এক্সটেনশন ফাংশনগুলি ব্যবহার করে, এটি আপনার যেকোন পুনর্ব্যবহারযোগ্য ভিউতে ব্যবহার করা যেতে পারে। ক্লায়েন্ট কোড মাত্র 1 লাইন।

ঠিক আছে, আমি onBindViewHolder এর onBindViewHolder পদ্ধতিটি ব্যবহার করে এটি onBindViewHolder

নাটক:

public interface OnViewHolderListener {
    void onRequestedLastItem();
}

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

    ...

    if (position == getItemCount() - 1) onViewHolderListener.onRequestedLastItem();
}

Fragment (বা কার্যকলাপ) :

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    contentView = inflater.inflate(R.layout.comments_list, container, false);
    recyclerView = (RecyclerView) mContentView.findViewById(R.id.my_recycler_view);
    adapter = new Adapter();
    recyclerView.setAdapter(adapter);

    ...

    adapter.setOnViewHolderListener(new Adapter.OnViewHolderListener() {
        @Override
        public void onRequestedLastItem() {
            //TODO fetch new data from webservice
        }
    });
    return contentView;
}

বেশিরভাগ উত্তর অনুমান করা হয় যে RecyclerView GridLayoutManager একটি GridLayoutManager , অথবা GridLayoutManager , এমনকি GridLayoutManager ব্যবহার করে, অথবা অনুমান করছে যে স্ক্রোলিং উল্লম্ব বা হরিজন্টলাল, কিন্তু কোনও একটি সম্পূর্ণ জেনেরিক উত্তর পোস্ট করেনি

ViewHolder অ্যাডাপ্টার ব্যবহার করে পরিষ্কারভাবে একটি ভাল সমাধান নয়। একটি অ্যাডাপ্টারের এটি ব্যবহার করে 1 এর বেশি RecyclerView থাকতে পারে। এটা তাদের বিষয়বস্তু "adapts"। এটি পুনর্ব্যবহারযোগ্য দৃশ্য হওয়া উচিত (যা এক শ্রেণীর যা ব্যবহারকারীর কাছে বর্তমানে প্রদর্শিত হয়, এবং অ্যাডাপ্টার নয় যা শুধুমাত্র RecyclerView সামগ্রী সরবরাহ করার জন্য দায়ী) যা আপনার সিস্টেমে অবহিত করা উচিত যা আরো আইটেমগুলির প্রয়োজন হয় ( লোড করা)।

এখানে আমার সমাধান, RecyclerView (RecycerView.LayoutManager এবং RecycerView.Adapter) এর বিমূর্ত শ্রেণীগুলির চেয়ে অন্য কিছু ব্যবহার করে:

/**
 * Listener to callback when the last item of the adpater is visible to the user.
 * It should then be the time to load more items.
 **/
public abstract class LastItemListener extends RecyclerView.OnScrollListener {

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

      // init
      RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
      RecyclerView.Adapter adapter = recyclerView.getAdapter();

      if (layoutManager.getChildCount() > 0) {
        // Calculations..
        int indexOfLastItemViewVisible = layoutManager.getChildCount() -1;
        View lastItemViewVisible = layoutManager.getChildAt(indexOfLastItemViewVisible);
        int adapterPosition = layoutManager.getPosition(lastItemViewVisible);
        boolean isLastItemVisible = (adapterPosition == adapter.getItemCount() -1);

        // check
        if (isLastItemVisible)
          onLastItemVisible(); // callback
     }
   }

   /**
    * Here you should load more items because user is seeing the last item of the list.
    * Advice: you should add a bollean value to the class
    * so that the method {@link #onLastItemVisible()} will be triggered only once
    * and not every time the user touch the screen ;)
    **/
   public abstract void onLastItemVisible();

}


// --- Exemple of use ---

myRecyclerView.setOnScrollListener(new LastItemListener() {
    public void onLastItemVisible() {
         // start to load more items here.
    }
}

যদিও গৃহীত উত্তর পুরোপুরিভাবে কাজ করে তবে নীচের সমাধান addOnScrollListener ব্যবহার করে কারণ সেটঅনক্রোকলিস্টারটি অব্যবহৃত, এবং ভেরিয়েবল সংখ্যা এবং যদি শর্তগুলি হ্রাস করে।

final LinearLayoutManager layoutManager = new LinearLayoutManager(context);
feedsRecyclerView.setLayoutManager(layoutManager);

feedsRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        if (dy > 0) {   
            if ((layoutManager.getChildCount() + layoutManager.findFirstVisibleItemPosition()) >= layoutManager.getItemCount()) {
                Log.d("TAG", "End of list");
                //loadMore();
            }
        }
    }
});

শেষ আইটেম সম্পূর্ণরূপে দেখানো হয় যখন শুধুমাত্র বিজ্ঞপ্তি পেতে চান, তাদের জন্য আপনি View.canScrollVertically() ব্যবহার করতে পারেন।

এখানে আমার বাস্তবায়ন:

public abstract class OnVerticalScrollListener
        extends RecyclerView.OnScrollListener {

    @Override
    public final void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        if (!recyclerView.canScrollVertically(-1)) {
            onScrolledToTop();
        } else if (!recyclerView.canScrollVertically(1)) {
            onScrolledToBottom();
        } else if (dy < 0) {
            onScrolledUp();
        } else if (dy > 0) {
            onScrolledDown();
        }
    }

    public void onScrolledUp() {}

    public void onScrolledDown() {}

    public void onScrolledToTop() {}

    public void onScrolledToBottom() {}
}

দ্রষ্টব্য: আপনি যদি recyclerView.getLayoutManager().canScrollVertically() ব্যবহার করতে পারেন recyclerView.getLayoutManager().canScrollVertically() আপনি যদি API <14 সমর্থন করতে চান তবে।


আমি কিভাবে এটি সহজ, সহজ এবং সংক্ষিপ্ত:

    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener()
    {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy)
        {
            if(!recyclerView.canScrollVertically(1) && dy != 0)
            {
                // Load more results here

            }
        }
    });

@ কুশাল @ আবদুলজিজ

কেন এই যুক্তি ব্যবহার করে না?

public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
    int totalItemCount, lastVisibleItemPosition;

    if (dy > 0) {
      totalItemCount = _layoutManager.getItemCount();
      lastVisibleItemPosition = _layoutManager.findLastVisibleItemPosition();

      if (!_isLastItem) {
        if ((totalItemCount - 1) == lastVisibleItemPosition) {
          LogUtil.e("end_of_list");

          _isLastItem = true;
        }
      }
    }
  }

এই সমাধান আমার জন্য পুরোপুরি কাজ করে।

//Listener    

public abstract class InfiniteScrollListener     extendsRecyclerView.OnScrollListener {

public static String TAG = InfiniteScrollListener.class.getSimpleName();
int firstVisibleItem, visibleItemCount, totalItemCount;
private int previousTotal = 0;
private boolean loading = true;
private int visibleThreshold = 1;
private int current_page = 1;

private LinearLayoutManager mLinearLayoutManager;

public InfiniteScrollListener(LinearLayoutManager linearLayoutManager) {
    this.mLinearLayoutManager = linearLayoutManager;
}

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

    visibleItemCount = recyclerView.getChildCount();
    totalItemCount = mLinearLayoutManager.getItemCount();
    firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();

    if (loading) {
        if (totalItemCount > previousTotal) {
            loading = false;
            previousTotal = totalItemCount;
        }
    }
    if (!loading && (totalItemCount - visibleItemCount - firstVisibleItem <= visibleThreshold)) {

        current_page++;

        onLoadMore(current_page);

        loading = true;
    }
}

public void resetState() {
    loading = true;
    previousTotal = 0;
    current_page = 1;
}

public abstract void onLoadMore(int current_page);
}

//Implementation into fragment 
 private InfiniteScrollListener scrollListener;

scrollListener = new InfiniteScrollListener(manager) {
        @Override
        public void onLoadMore(int current_page) {
            //Load data
        }
    };
    rv.setLayoutManager(manager);
    rv.addOnScrollListener(scrollListener);

নিচে চেষ্টা করুন

import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.LayoutManager;

/**
 * Abstract Endless ScrollListener
 * 
 */
public abstract class EndlessScrollListener extends
        RecyclerView.OnScrollListener {
    // The minimum amount of items to have below your current scroll position
    // before loading more.
    private int visibleThreshold = 10;
    // The current offset index of data you have loaded
    private int currentPage = 1;
    // True if we are still waiting for the last set of data to load.
    private boolean loading = true;
    // The total number of items in the data set after the last load
    private int previousTotal = 0;
    private int firstVisibleItem;
    private int visibleItemCount;
    private int totalItemCount;
    private LayoutManager layoutManager;

    public EndlessScrollListener(LayoutManager layoutManager) {
        validateLayoutManager(layoutManager);
        this.layoutManager = layoutManager;
    }

    public EndlessScrollListener(int visibleThreshold,
            LayoutManager layoutManager, int startPage) {
        validateLayoutManager(layoutManager);
        this.visibleThreshold = visibleThreshold;
        this.layoutManager = layoutManager;
        this.currentPage = startPage;
    }

    private void validateLayoutManager(LayoutManager layoutManager)
            throws IllegalArgumentException {
        if (null == layoutManager
                || !(layoutManager instanceof GridLayoutManager)
                || !(layoutManager instanceof LinearLayoutManager)) {
            throw new IllegalArgumentException(
                    "LayoutManager must be of type GridLayoutManager or LinearLayoutManager.");
        }
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        visibleItemCount = recyclerView.getChildCount();
        totalItemCount = layoutManager.getItemCount();
        if (layoutManager instanceof GridLayoutManager) {
            firstVisibleItem = ((GridLayoutManager) layoutManager)
                    .findFirstVisibleItemPosition();
        } else if (layoutManager instanceof LinearLayoutManager) {
            firstVisibleItem = ((LinearLayoutManager) layoutManager)
                    .findFirstVisibleItemPosition();
        }
        if (loading) {
            if (totalItemCount > previousTotal) {
                loading = false;
                previousTotal = totalItemCount;
            }
        }
        if (!loading
                && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
            // End has been reached do something
            currentPage++;
            onLoadMore(currentPage);
            loading = true;
        }
    }

    // Defines the process for actually loading more data based on page
    public abstract void onLoadMore(int page);

}

আমি আপনাকে আমার aproximation যাক। আমার জন্য জরিমানা কাজ করে।

আমি এটি আপনাকে সাহায্য করে আশা করি।

/**
 * Created by Daniel Pardo Ligorred on 03/03/2016.
 */
public abstract class BaseScrollListener extends RecyclerView.OnScrollListener {

    protected RecyclerView.LayoutManager layoutManager;

    public BaseScrollListener(RecyclerView.LayoutManager layoutManager) {

        this.layoutManager = layoutManager;

        this.init();
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

        super.onScrolled(recyclerView, dx, dy);

        this.onScroll(recyclerView, this.getFirstVisibleItem(), this.layoutManager.getChildCount(), this.layoutManager.getItemCount(), dx, dy);
    }

    private int getFirstVisibleItem(){

        if(this.layoutManager instanceof LinearLayoutManager){

            return ((LinearLayoutManager) this.layoutManager).findFirstVisibleItemPosition();
        } else if (this.layoutManager instanceof StaggeredGridLayoutManager){

            int[] spanPositions = null; //Should be null -> StaggeredGridLayoutManager.findFirstVisibleItemPositions makes the work.

            try{

                return ((StaggeredGridLayoutManager) this.layoutManager).findFirstVisibleItemPositions(spanPositions)[0];
            }catch (Exception ex){

                // Do stuff...
            }
        }

        return 0;
    }

    public abstract void init();

    protected abstract void onScroll(RecyclerView recyclerView, int firstVisibleItem, int visibleItemCount, int totalItemCount, int dx, int dy);

}

একা তথ্য মডেলের বিশুদ্ধ যুক্তি ব্যবহার করে স্ক্রোল শ্রোতা ছাড়াও বাস্তবায়ন করা সম্ভব। স্ক্রোল দৃশ্যটি পজিশনের পাশাপাশি সর্বাধিক আইটেমের গণনা করে আইটেমগুলি পেতে হবে। মডেলটি ব্যাকগ্রাউন্ড লজিকের প্রয়োজনীয় উপাদানগুলিকে একের পরিবর্তে আনতে ব্যাকগ্রাউন্ড যুক্তি থাকতে পারে এবং এটি ব্যাকগ্রাউন্ড থ্রেডে এটি করতে পারে, ডেটা প্রস্তুত হওয়ার সময় দৃশ্যটি সূচিত করে।

এই পদ্ধতিটি আনুষ্ঠানিকভাবে অনুরোধ করা (বর্তমানে দৃশ্যমান) আইটেমগুলিকে পুরোনো (সর্বাধিক সম্ভবত ইতিমধ্যে স্ক্রোল করা) জমাগুলি পছন্দ করে যা সমান্তরাল থ্রেডগুলির সংখ্যা এবং ব্যবহারের মতো জিনিসগুলিকে নিয়ন্ত্রণ করতে পছন্দ করে। এই পদ্ধতির (ডেমো অ্যাপ্লিকেশান এবং পুনর্ব্যবহারযোগ্য গ্রন্থাগার) জন্য সম্পূর্ণ সোর্স কোড পাওয়া যায় here


if (layoutManager.findLastCompletelyVisibleItemPosition() == 
 recyclerAdapter.getItemCount() - 1) {
    //load more items.
 }

পরিষ্কার এবং সহজ। এই কাজ করবে।





onscrolllistener