Ich möchte Bilder von Flickr in Android-App herunterladen und zeigen sie in meinem RecyclerView (GridLayoutManager). Hier ist mein Code mit Seiten zu holen (Standard page = 1)scrollen RecyclerView in 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;
}
, wenn ich diese Elemente erhalten i fügen Sie Adapter Artikel recyclerviews und beobachten, wenn ich nicht ihr Ende erreichen neue Daten in holen dieser Fall (verwendet Hilfe von 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));
}
}
meine AsyncTask Implementierung
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();
}
}
das Problem ist, denke ich, in Stück
if ((visibleItemCount + pastVisibleItems) >= totalItemCount) {
currentpage++;
new FetchItemsTask().execute(new Integer[]{currentpage});
}
Immer wenn ich mehr und mehr Zeit verbringe, um die Ansicht nach unten zu scrollen. Erster Bildlauf: totalItemCount = 100, es funktioniert gut. Beim nächsten scroll wird pastVisibleItems gleich 0, totalItemCount = 200 (flickr gibt Seiten mal 100) und es dauert immer länger, neue Bilder neu zu laden. Ich habe versucht,
if ((visibleItemCount + pastVisibleItems+(currentpage-1)*100) >= totalItemCount) {
currentpage++;
new FetchItemsTask().execute(new Integer[]{currentpage});
}
zu verwenden, aber dann Ansicht Recycler hält mich erste Seite zeigt (. Wie kann ich es richtig umsetzen?
Hier mein Adapter und ViewHolder Codes sind
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();
}
}