2016-09-24 76 views
1

我想從android應用程序中的Flickr下載圖片,並在我的RecyclerView(GridLayoutManager)中顯示它們。這裏是我的代碼與頁面獲取它(默認頁面= 1)向下滾動Android中的RecyclerView

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

回答

0

我已經找到答案,問題爲什麼pastVisibleItems設置爲零是因爲生成適配器的新實例

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

}

我改成了

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

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

,現在一切正常華麗!感謝關注)