2014-09-29 129 views
0

我有一个网格视图,并希望在列表结束后更新网格视图中的项目。为了实现这个,我决定使用OnScrollListener。但OnScrollListener的行为很奇怪,因为它叫我的方法来更新网格视图多次..OnScrollListener更新GridView

@Override 
      public void onScroll(AbsListView view, int firstVisibleItem, 
        int visibleItemCount, int totalItemCount) { 
       // TODO Auto-generated method stub 

       if (firstVisibleItem + visibleItemCount >= totalItemCount) { 
        // End has been reached 
        // Call method to update 

       Log.i("CountShit", String.valueOf(firstVisibleItem) + " + " 
         + String.valueOf(visibleItemCount) + " >= " 
         + String.valueOf(totalItemCount)); 
       } 
      } 
     }); 

,并在我的日志中,如果conditioin被称为多次作为onScrollListener不断听滚动我想..

09-29 14:06:10.338: I/CountShit(23640): 12 + 8 >= 20 
09-29 14:06:10.353: I/CountShit(23640): 12 + 8 >= 20 
09-29 14:06:10.369: I/CountShit(23640): 12 + 8 >= 20 
09-29 14:06:10.385: I/CountShit(23640): 12 + 8 >= 20 
09-29 14:06:10.400: I/CountShit(23640): 12 + 8 >= 20 
09-29 14:06:10.424: I/CountShit(23640): 14 + 6 >= 20 
09-29 14:06:10.439: I/CountShit(23640): 14 + 6 >= 20 
09-29 14:06:10.455: I/CountShit(23640): 14 + 6 >= 20 
09-29 14:06:10.470: I/CountShit(23640): 14 + 6 >= 20 
09-29 14:06:10.486: I/CountShit(23640): 14 + 6 >= 20 

有没有办法这样说,如果我打的名单第一时间结束时,我upate方法被称为..然后当用户向上或向下滚动或任何方法不应再次呼吁! (直到我到达我更新的课程列表的末尾)。

+1

检查:https://github.com/thecodepath/android_guides/wiki/Endless-Scrolling-with-AdapterViews – 2014-09-29 08:57:17

回答

0

我能够通过增加一些变量来解决这个问题

 private int previousTotal = 0; 
     private boolean loading = true; 
     private int visibleThreshold = 5; 

和检查以下条件..

 public void onScroll(AbsListView view, int firstVisibleItem, 
       int visibleItemCount, int totalItemCount) { 
      // TODO Auto-generated method stub 
      if (loading) { 
       if (totalItemCount > previousTotal) { 
        loading = false; 
        previousTotal = totalItemCount; 
        pageCount++; 
       } 
      } 
      if (!loading 
        && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) { 
       // End has been reached 
       Log.i("CountShit", String.valueOf(firstVisibleItem) + " + " 
         + String.valueOf(visibleItemCount) + " >= " 
         + String.valueOf(totalItemCount)); 
       // call update method here 
       loading = true; 
      } 
     } 
    }); 
1

totalDataCount - >变量存储数据的总数你的API可以让你

previousTotal - >变量,它存储先前总数。默认情况下它被设置为零。

loading - >布尔值默认设置为false。

中声明你的活动,而不是在内部类(如下图)

此代码将在下面工作的所有这些变量: -

public class EndlessScrollListenerUser implements OnScrollListener { 
    boolean loading = true; 

    public EndlessScrollListenerUser() {} 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, 
      int visibleItemCount, int totalItemCount) { 
     int lastInScreen = firstVisibleItem + visibleItemCount; 
     if (loading) { 
      if (totalItemCount > previousTotal) { 
       loading = false; 
       previousTotal = totalItemCount; 
      } 
     } 
     if (!loading && lastInScreen==totalItemCount && totalDataCount>takeUser && (previousTotal)<totalDataCount) { 

      // Your API Call Goes Here after reaching end 
      loading = true; 
     } 
    } 

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

谢谢!你的答案非常有帮助 – 2014-09-29 09:19:10

+0

@rogerthatcode - 请接受我的回答。 – 2014-09-29 09:32:55

3

您正在寻找无尽的视图。您必须创建一个无限滚动监听器并将其应用于GridView。尝试下面的代码;

初始化GridView和应用适配器

final GridView g = (GridView) findViewById(R.id.myGrid); 
     g.setAdapter(new ImageAdapter(this)); 
     EndlessScrollListener scrollListener=new EndlessScrollListener(g,new RefreshList() { 

      @Override 
      public void onRefresh(int pageNumber) { 
       System.out.println("On Refresh invoked.."); 

      } 
     }); 
     g.setOnScrollListener(scrollListener); 

EndlessScrollListener

public class EndlessScrollListener implements OnScrollListener { 

    private GridView gridView; 
    private boolean isLoading; 
    private boolean hasMorePages; 
    private int pageNumber=0; 
    private RefreshList refreshList; 
    private boolean isRefreshing; 

    public EndlessScrollListener(GridView gridView,RefreshList refreshList) { 
     this.gridView = gridView; 
     this.isLoading = false; 
     this.hasMorePages = true; 
     this.refreshList=refreshList; 
    } 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
     if (gridView.getLastVisiblePosition() + 1 == totalItemCount && !isLoading) { 
      isLoading = true; 
      if (hasMorePages&&!isRefreshing) { 
       isRefreshing=true; 
       refreshList.onRefresh(pageNumber); 
      } 
     } else { 
      isLoading = false; 
     } 

    } 

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

    } 

    public void noMorePages() { 
     this.hasMorePages = false; 
    } 

    public void notifyMorePages(){ 
     isRefreshing=false; 
     pageNumber=pageNumber+1; 
    } 

    public interface RefreshList { 
     public void onRefresh(int pageNumber); 
    } 
} 

Source

+0

嗨,我想你已经从这里复制这段代码:http://stackoverflow.com/questions/10923034/endless-gridview – 2014-09-29 08:56:53

+0

谢谢,我正在寻找这个链接,但无法找到,所以从我的项目中复制代码和粘贴在这里。现在我可以在我的答案中更新链接。 – 2014-09-29 08:59:49

+0

谢谢你们,我解决了它:D – 2014-09-29 09:19:38