2017-10-20 1 views
1

ich den folgenden Code gefunden haben, etwas zu tun, wenn ich das Ende einer gridview erreichen:Infinite Aufruf „OnScroll“, wenn Reichweite Ende der Rasteransicht

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) { 
    } 

Die Sache ist die, dass, wenn ich das erreichen Ende der GridView wird diese Methode fortlaufend aufgerufen.

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

Ich glaube, meine Fehler in der fetchMoreItems() Methode sein sollten, aber da es mein erstes Mal mit Gridview ist, ich bin nicht sicher,

Antwort

0

Sie müssen die Verfahren zu vermeiden, werden mehrmals aufgerufen, wie folgt aus:

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; 
    } 
} 
0

Sie einen booleschen Wert verwenden können mehrere Anrufe wie dies zu verhindern:

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) { 
     } 

Sie können isFetching nach dem Abrufen auch auf false setzen.