2016-09-24 15 views
1

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

Antwort

0

Ich habe Antwort gefunden, die Problematik, warum PastVisibleItems auf Null gesetzt wurde, war wegen der Generierung der neuen Instanz des Adapters in

private void setAdapter(){ 
if(isAdded()){ 
    mPhotoRecyclerView.setAdapter(new PhotoAdapter(mItems)); 
} 

}

Habe ich es zu

private void setAdapter(){ 
    if(isAdded()){ 

     if (mPhotoRecyclerView.getAdapter()==null) 
      mPhotoRecyclerView.setAdapter(new PhotoAdapter(mItems)); 
     else 
      mPhotoRecyclerView.getAdapter().notifyDataSetChanged(); 
    } 
} 

und jetzt alles funktioniert hervorragend! Danke für die Aufmerksamkeit)

Verwandte Themen