Search code examples
androidlistviewendlessadapter

How do i set limit for loading list items in Cwac-Endlessadapter when user scroll down to end of list


For eg:- if i load first 5 items in a list then on scrolling down load next five items

and as it is a endlessadapter this procedure must repeat endlessly this is how i tried -->foliowing is my demoadapter code:-

   public class MyDemoAdapter extends EndlessAdapter {

private static int cutting_int =5;
public static int batch_repeat = 0;
public int check_batch = 0;
private Context mcontxt;
private RotateAnimation rotate = null;
ArrayList<DownloadOffersClass> tempList = new ArrayList<DownloadOffersClass>();
private static int mLastOffset = 0;
private ArrayList<DownloadOffersClass> list = new ArrayList<DownloadOffersClass>();
private int LIST_SIZE;


public MyDemoAdapter(Context context, int textViewResourceId,
        ArrayList<DownloadOffersClass> list, int lIST_SIZE) {
    super(new DownloadedOffersAdapter(context,
            R.layout.offer_listview_item, list));
    this.mcontxt = context;
    this.list = list;
    this.LIST_SIZE = lIST_SIZE;
    rotate = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF,
            0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    rotate.setDuration(600);
    rotate.setRepeatMode(Animation.RESTART);
    rotate.setRepeatCount(Animation.INFINITE);
}

@Override
protected View getPendingView(ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) mcontxt
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View row = inflater.inflate(R.layout.row, null);

    View child = row.findViewById(android.R.id.text1);

    child.setVisibility(View.GONE);

    child = row.findViewById(R.id.throbber);
    child.setVisibility(View.VISIBLE);
    child.startAnimation(rotate);

    return (row);
}

@Override
protected boolean cacheInBackground() {
    SystemClock.sleep(2000);

    if (check_batch != batch_repeat) {
        tempList.clear();
        int lastOffset = getLastOffset();
        if (lastOffset < LIST_SIZE) {
            int limit = lastOffset + cutting_int;
            for (int i = (lastOffset + 1); (i <= limit && i < LIST_SIZE); i++) {
                tempList.add(list.get(i));
            }
            setLastOffset(limit);

            if (limit < 50) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    } else {
        return false;
    }
}

@Override
protected void appendCachedData() {
    if (getWrappedAdapter().getCount() < 50) {
        @SuppressWarnings("unchecked")
        DownloadedOffersAdapter a = (DownloadedOffersAdapter) getWrappedAdapter();

        check_batch = check_batch + 1;
        Log.v("Check", " " + check_batch);
        for (int i = cutting_int; i < cutting_int + cutting_int; i++) {
            a.add(list.get(i));
        }
    }
}

public static void setLastOffset(int i) {
    mLastOffset = i; 
}

private int getLastOffset() {
    return mLastOffset;
}

}


Solution

  • Modify your cacheInBackground()

    if (check_batch != batch_repeat) {
                tempList.clear();
                int lastOffset = getLastOffset();
                if (lastOffset < LIST_SIZE) {
                    int limit = lastOffset + cutting_int;
                    for (int i = (lastOffset + 1); (i <= limit && i <                                           LIST_SIZE); i++) {
                        tempList.add(list.get(i));
                    }
                    setLastOffset(limit);
    
                    if (limit <= 50) {
                        return true;
                    } else {
                        return false;
                    }
                } else {
                    return false;
                }
            } else {
                if (!firstTry) {// use this boolean to do it only once
                    tempList.clear();
                    int notDivisible = LIST_SIZE % cutting_int;
                    if (!(notDivisible == 0)) {
                        firstTry = true;
                        return true;
                    } else {
                        return false;
                    }
                }
                return false;
            }
    

    And replace your appendCachedData() method with this:

      protected void appendCachedData() {
    
            DownloadedOffersAdapter a = (DownloadedOffersAdapter) getWrappedAdapter();
            if (check_batch != batch_repeat) {
                if (getWrappedAdapter().getCount() <= 50) {
                    check_batch = check_batch + 1;
                    Log.v("Check", "append chk_batch " + check_batch);
                    for (int i = cutting_int; i < cutting_int + cutting_int; i++) {
                        a.add(list.get(i));
                    }
                }
            } else {// Append extra entries to list i.e less than cutting_int
                int notDivisible = LIST_SIZE % cutting_int;
                for (int i = (LIST_SIZE - notDivisible); i < LIST_SIZE - 1; i++) {
                    a.add(list.get(i));
                }
                return;
            }
        }