Я хочу загрузить фотографии из Flickr в Android-приложение и показать их в моем RecyclerView (GridLayoutManager). Вот мой код, чтобы забрать его со страницами (на странице по умолчанию = 1)прокрутка RecyclerView в Android
public List<GalleryItem> fetchItems(Integer page){
if (page==null) page=1;
List<GalleryItem> items=new ArrayList<>();
try {
String url = Uri.parse("https://api.flickr.com/services/rest/")
.buildUpon()
.appendQueryParameter("method", "flickr.photos.getRecent")
.appendQueryParameter("api_key", API_KEY)
.appendQueryParameter("format", "json")
.appendQueryParameter("nojsoncallback", "1")
.appendQueryParameter("extras", "url_s")
.appendQueryParameter("page",page.toString())
.build().toString();
String jsonString = getUrlString(url);
Log.i(TAG, "Received JSON: " + jsonString);
JSONObject jsonBody = new JSONObject(jsonString);
parseItems(items,jsonBody);
}
catch (JSONException jse){
Log.e(TAG,"Failed to parse JSON",jse);
}
catch (IOException ioe){
Log.e(TAG,"Failed to fetch items",ioe);
}
return items;
}
, когда я получаю эти пункты я добавить их в recyclerviews адаптеров элементов и посмотреть, если я не достиг своей цели, чтобы принести новые данные в этот случай (используется помощь от How to implement endless list with RecyclerView?)
private RecyclerView mPhotoRecyclerView;
private List<GalleryItem> mItems=new ArrayList<>();
GridLayoutManager mGridLayoutManager;
int pastVisibleItems, visibleItemCount, totalItemCount,currentpage=1;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v=inflater.inflate(R.layout.fragment_photo_gallery,container,false);
mPhotoRecyclerView=(RecyclerView)v.findViewById(R.id.fragment_photo_gallery_recycler_view);
mGridLayoutManager=new GridLayoutManager(getActivity(),3);
mPhotoRecyclerView.setLayoutManager(mGridLayoutManager);
mPhotoRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
if (dy>0) {
visibleItemCount = mGridLayoutManager.getChildCount();
totalItemCount = mGridLayoutManager.getItemCount();
pastVisibleItems = mGridLayoutManager.findFirstVisibleItemPosition();
// ppastVisibleItems = mGridLayoutManager.findLastVisibleItemPosition();
if ((visibleItemCount + pastVisibleItems) >= totalItemCount) {
currentpage++;
new FetchItemsTask().execute(new Integer[]{currentpage});
}
}
}
});
setAdapter();
return v;
}
private void setAdapter(){
if(isAdded()){
mPhotoRecyclerView.setAdapter(new PhotoAdapter(mItems));
}
}
мой AsyncTask Реализация
private class FetchItemsTask extends AsyncTask<Integer,Void,List<GalleryItem>>{
@Override
protected List<GalleryItem> doInBackground(Integer... voids) {
// try{
//
// String result=new FlickrFetchr().getUrlString("https://www.bignerdranch.com");
// Log.i(TAG,"Fetched contents of URL: "+result);
// }
// catch (IOException ioe){
// Log.e(TAG,"Failed to fetch URL: "+ioe.getMessage(),ioe);
// }
return new FlickrFetchr().fetchItems(currentpage);
}
@Override
protected void onPostExecute(List<GalleryItem> items) {
mItems.addAll(items);
setAdapter();
}
}
проблема я думаю, что в куске
if ((visibleItemCount + pastVisibleItems) >= totalItemCount) {
currentpage++;
new FetchItemsTask().execute(new Integer[]{currentpage});
}
каждый раз, когда я трачу все больше и больше времени на прокрутку вниз. Первая прокрутка: totalItemCount = 100, она отлично работает. При следующем прокрутке pastVisibleItems получает равный 0, totalItemCount = 200 (flickr дает страницы на 100), и тем самым требуется больше времени для повторной загрузки новых фото. я пытался использовать
if ((visibleItemCount + pastVisibleItems+(currentpage-1)*100) >= totalItemCount) {
currentpage++;
new FetchItemsTask().execute(new Integer[]{currentpage});
}
но вид утилизатор продолжает показывать мне первую страницу (. Как я могу осуществить это правильно?
Вот мой адаптер и ViewHolder коды
private class PhotoHolder extends RecyclerView.ViewHolder{
private TextView mTitleTextView;
public PhotoHolder(View itemView) {
super(itemView);
mTitleTextView=(TextView)itemView;
}
public void bindGalleryItem(GalleryItem item){
mTitleTextView.setText(item.toString());
}
}
private class PhotoAdapter extends RecyclerView.Adapter<PhotoHolder>{
private List<GalleryItem> mGalleryItems;
public PhotoAdapter(List<GalleryItem> galleryItems) {
mGalleryItems=galleryItems;
}
@Override
public PhotoHolder onCreateViewHolder(ViewGroup parent, int viewType) {
TextView textView=new TextView(getActivity());
return new PhotoHolder(textView);
}
@Override
public void onBindViewHolder(PhotoHolder holder, int position) {
holder.bindGalleryItem(mGalleryItems.get(position));
}
@Override
public int getItemCount() {
return mGalleryItems.size();
}
}