Динамическая подгрузка контента onScroll

241
26 апреля 2017, 09:54

Я новичок в java, подскажите что я делаю не так. Проблема заключается в том что мне нужно по мере скролинга добавлять все новый и новый контент. В моем коде где то ошибка, или я не правильно понимаю логику некоторых функций, объясните в чем дело и как это поправить.

Мой MainActivity.java

public class MainActivity extends AppCompatActivity {
    private String debug = MainActivity.class.getSimpleName();
    private ListView items;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        items = (ListView) findViewById(R.id.items);
        new ContentAsyncTask(MainActivity.this, items, 0).execute();

        items.setOnScrollListener(new InfiniteScrollListener(5) {
            @Override
            public void loadMore(int currentPage, int totalItemsCount) {
                new ContentAsyncTask(MainActivity.this, items, totalItemsCount).execute();

            }
        });
    }
}

Класс ContentAsyncTask.java Получаем контент по URL и добавляет его

class ContentAsyncTask extends AsyncTask<Object, Object, List<Document>> {
    private String debug = MainActivity.class.getSimpleName();
    private Context context;
    private View view;
    private int skip;
    ContentAsyncTask(Context context, View view, int skip) {
        this.context = context;
        this.view = view;
        this.skip = skip;
    }

    @Override
    protected List<Document> doInBackground(Object... params) {
        HttpHandler sh = new HttpHandler();
        String page = "https://site.ru/getContent?limit=20&skip=" + this.skip;
        JSONArray content = sh.makeServiceCall(page);
        List<Document> list = new ArrayList<>();
        Gson gson = new Gson();
        for(int i = 0; i < content.length(); i++) {
            try {
                JSONObject x = content.getJSONObject(i);
                Document document = gson.fromJson(x.toString(), Document.class);
                //list.add(document);
                list.add(new Document(i, document.getImage("mid"), document.getDomain()));
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        return list;
    }
    @Override
    protected void onPostExecute(List<Document> documents) {
        super.onPostExecute(documents);
        ProductListAdapter adapter = new ProductListAdapter(context.getApplicationContext(), documents);
        ListView lv = (ListView) view.findViewById(R.id.items);
        if(this.skip == 0 ) {
            lv.setAdapter(adapter);
        } else {
            adapter.addListItemToAdapter(documents);
        }
    }
}

InfiniteScrollListener.java

abstract class InfiniteScrollListener implements AbsListView.OnScrollListener {
    private int bufferItemCount = 10;
    private int currentPage = 0;
    private int itemCount = 0;
    private boolean isLoading = true;
    InfiniteScrollListener(int bufferItemCount) {
        this.bufferItemCount = bufferItemCount;
    }
    abstract void loadMore(int page, int totalItemsCount);
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        // Do Nothing2
    }
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        if (totalItemCount < itemCount) {
            this.itemCount = totalItemCount;
            if (totalItemCount == 0) {
                this.isLoading = true; }
        }
        if (isLoading && (totalItemCount > itemCount)) {
            isLoading = false;
            itemCount = totalItemCount;
            currentPage++;
        }
        if (!isLoading && (totalItemCount - visibleItemCount)<=(firstVisibleItem + bufferItemCount)) {
            loadMore(currentPage + 1, totalItemCount);
            isLoading = true;
        }
    }
}
Answer 1

Обычно вопрос подгрузки списка решается иначе. В адаптере списка есть метод getView(). Этот метод вызывается, когда отрисовывается очередной элемент списка. В этом методе есть параметр int position, который дает нам порядковый номер показываемого элемента. Очень легко проверить, является ли position концом списка (или почти концом), если да, то грузим данные.

Слушать события onScroll плохая идея, так как они срабатывают очень часто при малейшем скроле списка.

READ ALSO
Ошибка hibernate java

Ошибка hibernate java

В запросе sessioncreateQuery возникает ошибка "cannot find symbol symbol: variable goods", хотя класс goods есть - описан в файле shop

245
Как сделать адаптивность на Joomla

Как сделать адаптивность на Joomla

Добрый день, Привет всем ребята!

333
меню для модальных окон

меню для модальных окон

есть меню открытия окон

230