Как установить ограничение для загрузки элементов списка в Cwac-Endlessadapter, когда пользователь прокручивает список до конца списка

Например:- если я загружаю первые 5 элементов в списке, то при прокрутке вниз загружаются следующие пять элементов

и, поскольку это бесконечный адаптер, эта процедура должна повторяться бесконечно, вот как я пытался -> следующий код моего демоадаптера:-

   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;
}

}

3 ответа

Решение

Измените свой 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;
        }

И замените ваш метод appendCachedData() следующим:

  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;
        }
    }

Вы создадите объект для ImageLoader в вашем listadapter.

ImageLoader lazyload = new ImageLoader(context);

public ImageLoader(Context context) {
        FileCache fileCache = new FileCache(context);
        ExecutorService executorService = Executors.newFixedThreadPool(5);
    }

Затем установите изображения для вашего адаптера getView() следующим образом.

  ImageView image = (ImageView) view.findViewById(R.id.yourImage);

    lazyload.displayImage(image);

загрузите ваши изображения

public void displayImage(String url, ImageView imageView) {
    if (bitmap != null)
        imageView.setImageBitmap(bitmap);

Например:- если я загружаю первые 5 элементов в списке, то при прокрутке вниз загружаются следующие пять элементов

Вы несете ответственность за заполнение адаптера достаточным количеством элементов для прокрутки, и 5 вряд ли будет достаточно.

Вы несете ответственность за определение количества дополнительных элементов для загрузки, когда вам предлагается загрузить дополнительные данные.

и, поскольку это бесконечный адаптер, эта процедура должна повторяться бесконечно

Или пока вы не скажете EndlessAdapter что больше нет данных, например, возвращая false от cacheInBackground(), Идея заключается в том, что когда вы выполняете вызов веб-службы для получения следующего набора данных, вы также должны определить, достиг ли вы конца доступных данных.

Другие вопросы по тегам