无限呼叫“onScroll”时,网格视图伸手可及结束

问题描述:

我发现下面的代码做一些事情,当我到达一个GridView的末尾:无限呼叫“onScroll”时,网格视图伸手可及结束

GridView gridview = (YMAnimatedGridview) v.findViewById(R.id.my_gridview); 
    gridview.setAdapter(adapter); 
    final View footerView = mainView 
      .findViewById(R.id.my_grid_footer_view); 
    gridview.setOnScrollListener(new GridView.OnScrollListener() { 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, 
      int visibleItemCount, int totalItemCount) { 

      if (firstVisibleItem + visibleItemCount == totalItemCount) { 

       // last item in grid is on the screen, show footer: 
       fetchMoreItems(); 

      } 
     } 

    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
    } 

的事情是,当我到达gridView的结尾,这个方法被连续调用。

private void fetchMoreItems() { 
    Log.i(LOG_TAG, "Reached the end of grid view"); //for debbug purposes 
    Integer lastIndex = thumbnails.length; //This is a Bitmap array with the data I'm alredy showing 
    Cursor cursor = getData(); 
    thumbnails = concat(thumbnails, new Bitmap[30]); 
    Integer lastIndexToRun = Math.min(30, cursor.getCount() - lastIndex); 
    for(int j = 0; j < lastIndexToRun; j++) { 
     Integer i = j + lastIndex; 
     cursor.moveToPosition(i); 
     thumbnails[i] = getThumbnail(i); 
    } 
    adapter.notifyDataSetChanged(); //This is the adapter used to fill the gridview 
    cursor.close(); 
} 

我觉得我的错误应该是在fetchMoreItems()方法,但因为它是利用GridView的我的第一次,我不知道

你需要避免多次调用该方法,像这样:

private int beforeLastItem; 

@Override 
public void onScroll(AbsListView view, int firstVisibleItem, 
        int visibleItemCount, int totalItemCount) { 
    final int lastItem = firstVisibleItem + visibleItemCount; 
    if (lastItem == totalItemCount) { 
     // last item in grid is on the screen, show footer: 
     if (beforeLastItem != lastItem){ //to avoid multiple calls for the last item 
      fetchMoreItems(); 
      beforeLastItem = lastItem; 
     } 
    } else { 
     beforeLastItem = lastItem; 
    } 
} 

您可以使用一个布尔值,以防止多个调用是这样的:

private final boolean isFetching = false; 
    GridView gridview = (YMAnimatedGridview) v.findViewById(R.id.my_gridview); 
    gridview.setAdapter(adapter); 
    final View footerView = mainView 
      .findViewById(R.id.my_grid_footer_view); 
    gridview.setOnScrollListener(new GridView.OnScrollListener() { 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, 
          int visibleItemCount, int totalItemCount) { 

      if (firstVisibleItem + visibleItemCount == totalItemCount && !isFetching) { 
       isFetching = true; 
       // last item in grid is on the screen, show footer: 
       fetchMoreItems(); 

      }else{ 
       if(isFetching){ 
        isFetching = false; 
       } 
      } 
     } 

     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) { 
     } 

您可以在获取完成后将isFetching设置为false。