Я новичок в 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;
}
}
}
Обычно вопрос подгрузки списка решается иначе. В адаптере списка есть метод getView()
. Этот метод вызывается, когда отрисовывается очередной элемент списка. В этом методе есть параметр int position
, который дает нам порядковый номер показываемого элемента. Очень легко проверить, является ли position
концом списка (или почти концом), если да, то грузим данные.
Слушать события onScroll
плохая идея, так как они срабатывают очень часто при малейшем скроле списка.
Виртуальный выделенный сервер (VDS) становится отличным выбором
В запросе sessioncreateQuery возникает ошибка "cannot find symbol symbol: variable goods", хотя класс goods есть - описан в файле shop