2014-07-17 13 views
5

Tôi đã triển khai bố cục làm mới vuốt cho chế độ xem lưới của mình và nó hoạt động hoàn hảo nếu tôi kéo (cuộn) xuống để làm mới được gọi.Bố cục làm mới swipe Android cuộn lên để làm mới

Tuy nhiên, tôi đang cố gắng tìm ra cách làm mới khi người dùng cuộn lên. Vì vậy, khi người dùng đạt đến cuối cùng của các mục trong lưới (giới hạn của tôi là 10) để khi người dùng thấy tất cả mười và sau đó kéo lên trên hoặc cố gắng tiếp tục cuộn thì làm cách nào tôi có thể làm mới?

Mọi trợ giúp đều được đánh giá cao.

Trả lời

5

để mọi người có thể: không biết câu trả lời cho câu hỏi này hoặc b: họ không sẵn sàng chia sẻ kiến ​​thức.

Dù sao sau một thời gian dài tôi đã đưa ra giải pháp của riêng mình. Tôi đã thêm một người biết lắng nghe cuộn để lưới của tôi, và tính toán khi tôi cuộn xuống đáy của màn hình, vào thời điểm này tôi nhớ lại phương pháp onRefresh() từ swipe để làm mới ...

EDIT để thêm biết thêm thông tin

Vì vậy, sau khi tôi đã làm một số nghiên cứu để tính toán khi người dùng đạt đến đáy của một cái nhìn lưới tôi đi theo những câu hỏi như this và những người khác để có được điều đó. Dưới đây là mã của tôi mà tôi phải thay đổi để nó hoạt động với chức năng làm mới bản địa. Thay đổi của tôi là để ngăn ngừa làm mới liên tục. Vì vậy, bao gồm trong tuyên bố của tôi nếu là một kiểm tra rằng nó không phải là hiện tại làm mới, vì vậy khi tôi đạt đến phía dưới nó làm mới, nhưng tôi đã không có kiểm tra để nó liên tục làm mới. Sau đó, tôi đã phải kiểm tra tổng số mục trong lưới của mình, như khi người dùng đến mục cuối cùng (mục cuối cùng), ứng dụng cũng được làm mới và không có gì để phá vỡ chu kỳ. Hy vọng đây là một số sự giúp đỡ ...

 worldBeersGrid.setOnScrollListener(new AbsListView.OnScrollListener() { 
     @Override 
     public void onScrollStateChanged(AbsListView absListView, int i) { 

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

      int position = firstVisibleItem+visibleItemCount; 
      int limit = totalItemCount; 
      int totalItems = sharedpreferences.getInt("WORLD ITEM COUNT", 0); 

      Log.i("TOTAL WORLD ITEMS", String.valueOf(totalItems)); 
      Log.i("LIMIT :::::::::::: ", String.valueOf(limit)); 
      Log.i("POSITION ::::::::::::", String.valueOf(position)); 
      Log.i("REFRESHING :::::::::::::::", String.valueOf(swipeRefreshLayout.isRefreshing())); 

      if(position>=limit && totalItemCount>0 && !swipeRefreshLayout.isRefreshing() && position <totalItems){ 
       swipeRefreshLayout.setRefreshing(true); 
       //In the below method I made my call to my ws... 
       onRefresh(); 
      } 
     } 
    }); 
+1

Hey @ DJ-DOO, tôi vừa cố gắng sao chép hành vi này và đang gặp sự cố. Tôi đã từng http://nlopez.io/swiperefreshlayout-with-listview-done-right/ để sửa chữa làm mới sớm GridView của tôi, nhưng tôi đang gặp rắc rối tính nơi cuối danh sách của tôi. Bạn có thể chỉnh sửa câu trả lời của bạn với cách bạn tính đáy không? Cảm ơn! –

3

Bạn thử cách này

listView.setOnScrollListener(new OnScrollListener() { 

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

@Override 
public void onScroll(AbsListView view, int firstVisibleItem, 
     int visibleItemCount, int totalItemCount) { 
    boolean enable = false; 
    if(listView != null && listView.getChildCount() > 0){ 
     // check if the first item of the list is visible 
     boolean firstItemVisible = listView.getFirstVisiblePosition() == 0; 
     // check if the top of the first item is visible 
     boolean topOfFirstItemVisible = listView.getChildAt(0).getTop() == 0; 
     // enabling or disabling the refresh layout 
     enable = firstItemVisible && topOfFirstItemVisible; 
    } 
    swipeRefreshLayout.setEnabled(enable); 
}}); 
5

Xem câu trả lời của tôi trong stackoverflow

SwipeRefreshLayout từ Thư viện hỗ trợ Android phiên bản 21 không hỗ trợ kéo từ dưới lên. Tôi đã thực hiện sửa đổi SwipeRefreshLayoutBottom với dựa trên mã SwipeRefreshLayout ban đầu. Nó hoàn toàn dựa trên mã Google ban đầu chỉ đảo ngược tọa độ và phương thức canChildScrollDown mới được ghi. Tất cả sửa đổi được đánh dấu là TODO.

Bitbucker repository

2

Một câu trả lời nếu ai vẫn còn quan tâm. Để làm mới khi cuộn xuống, tôi đã triển khai onRefreshListerner() trên swipeRefreshLayout.

swipeRefreshLayout = (SwipeRefreshLayout) getView().findViewById(R.id.swipe_messages); 
    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
     @Override 
     public void onRefresh() { 
      swipeRefreshLayout.setRefreshing(true); 

      (new Handler()).postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        refresh(); 
       } 
      }, 1000); 
     } 
    }); 

Nhưng để làm mới khi di chuyển lên và chỉ khi tôi đã có đến cuối danh sách, tôi đã thực hiện OnTouchListener() nằm trong danh sách bao gồm các swipeRefreshLayout.setRefreshing (true) để bắt đầu có hiệu lực:

listView.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == android.view.MotionEvent.ACTION_UP) { 

       if (listView.getLastVisiblePosition() == listView.getAdapter().getCount() -1 && 
         listView.getChildAt(listView.getChildCount() - 1).getBottom() <= listView.getHeight()) 
       { 

        swipeRefreshLayout.setRefreshing(true); 

        (new Handler()).postDelayed(new Runnable() { 
         @Override 
         public void run() { 
          refresh(); 
         } 
        }, 1000); 

       } 
      } 
      return false; 
     } 
    }); 

Tất nhiên bạn phải vô hiệu hóa các swipeRefreshLayout sau khi cập nhật danh sách của bạn:

public void refresh(){ 
    //Do something neat here to refresh your list 
    swipeRefreshLayout.setRefreshing(false); 
} 

Tôi đã sử dụng câu trả lời này để biết khi nào tôi phải cuối danh sách:

https://stackoverflow.com/a/10235887/6144027

Các vấn đề liên quan