2016-09-24 3 views
1

Я хочу загрузить фотографии из 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(); 
    } 
} 

ответ

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

и теперь все работает великолепно! Спасибо за внимание)

Смежные вопросы