2012-07-04 57 views
5

Trong Gingerbread, tôi không gặp vấn đề gì với việc sử dụng smoothScrollToPosition() để cuộn qua hàng chục mục cùng một lúc. Sau khi Nexus S của tôi đã được nâng cấp lên Ice Cream Sandwich, tôi nhận thấy rằng không có vấn đề gì tôi đặt trong smoothScrollToPosition(), nó sẽ chỉ cuộn về một vài trăm pixel theo một trong hai hướng, và sau đó dừng lại.smoothScrollToPosition() chỉ cuộn một phần trong Android ICS?

Đây có phải là sự cố đã biết với ICS không? Tôi đã nhận thấy điều này với Galaxy Nexus là tốt. Tôi đã xem xét một vài câu hỏi khác và thử một vài thủ thuật khác nhau, chẳng hạn như tắt các cuộc gọi đến notifyDataSetChanged() và đăng smoothScrollToPosition() dưới dạng runnable bị trì hoãn, nhưng rất tiếc, nó không muốn cuộn nhiều hơn một hàng trăm pixel hoặc hơn trước khi dừng. :(

+2

Tôi gặp sự cố tương tự. http://code.google.com/p/android/issues/detail?id=37278 – bigstones

+1

Tôi đã đăng ở đó một giải pháp thay thế. – bigstones

+0

Dường như nó được cố định trong Jellybean. –

Trả lời

12

Xuất hiện sự cố với thời lượng cần thiết để hoàn thành hoạt ảnh, cùng vấn đề với smoothScrollBy (khoảng cách int, thời lượng int), lướt qua lướt qua, smoothScrollToPosition() là trình bao bọc thân thiện xung quanh smoothScrollBy() smoothScrollBy() lần lượt là giả mạo một "cử chỉ tẩu thoát", như thể một người dùng đã thực hiện chuyển động.

smoothScrollBy thực sự chỉ cần đăng tải runnable tiếp tục tự repost cho đến khi thời lượng chạy Có nghĩa là nó đơn giản tính toán bù di chuyển cần thiết dựa trên độ lệch mà trước đó nó quyết định di chuyển đến, do đó nếu hết thời gian trước khi nó đạt đến giá trị bù mục tiêu, nó dừng lại ở mức bù trừ cuối cùng được tính toán. để bù đắp mục tiêu, đó là perhap s nhiều hơn vì nó sẽ không được hoạt hình). Khó khăn cho những kẻ Android đang xác định bao nhiêu để di chuyển bởi mỗi cuộc gọi chạy() để đạt được yêu cầu bù đắp bởi vì các tế bào ListView (trẻ em) là hoàn toàn năng động về chiều cao, vì vậy họ không thể chỉ làm một phép tính khoảng cách đơn giản vì chiều cao của trẻ em không thể nhìn thấy không được biết đến. Đó là lý do tương tự thanh cuộn Android có thể dao động kích thước khi bạn di chuyển, nó phải có một dự đoán tốt nhất tại mức độ lớn nó nên dựa trên những gì nó hiện đang nhìn thấy.

Dù sao điều đó không giúp bạn giải quyết nó nhưng một số người ta có thể tìm thấy nó thú vị :)

Nếu bạn biết bạn có chiều cao tế bào tĩnh tuy nhiên, bạn có thể viết phương pháp riêng của bạn để tính toán khoảng cách và thời gian để vượt qua tự smoothScrollBy() và có một khoảng thời gian tĩnh để di chuyển khoảng cách X. Nếu không, nó sẽ phải đủ để sử dụng giải pháp bigstones được đăng, điều này thực sự đang hoạt động vì SCROLL_DURATION cao hơn 1000ms. Bạn có thể sử dụng phiên bản ICS và thay đổi thuộc tính này, thay vì sử dụng phiên bản 2.2, không phải là nguyên nhân gốc.

Bạn cũng có thể điều chỉnh các runnables đó bằng thuật toán tùy chỉnh của riêng mình, không quá khó để chỉnh sửa mọi thứ.

0

Vì ListView sử dụng phương thức getChildCount() để lấy số vị trí trong mã nguồn AbsListView.java. nhưng trong ListView, phương thức getChildCount() không thể đếm được chính xác. Có lẽ bạn nên sử dụng phương thức setSelection().

2

Đây là những gì tôi đã làm để giải quyết vấn đề. Về cơ bản, chúng tôi muốn tiếp tục gọi smoothscrolling cho đến khi bạn đạt được phần tử mong muốn (trong trường hợp này, tôi chỉ đơn giản muốn cuộn lên trên cùng, là phần tử 0).

//There is a known bug where smoothScrollToPosition(..) may not reach the top, 
      //if the list is very large, keep scrolling until you reach the top element 
      newsFeed.setOnScrollListener(new OnScrollListener() { 
       @Override 
       public void onScrollStateChanged(AbsListView view, int scrollState) { 

       } 

       @Override 
       public void onScroll(AbsListView view, int firstVisibleItem, 
         int visibleItemCount, int totalItemCount) { 
        if(firstVisibleItem != 0) { 
         newsFeed.smoothScrollToPosition(0); 
        } 
        else { 
         //We are done 
         newsFeed.setOnScrollListener(null); 
        } 
       } 
      }); 
      newsFeed.smoothScrollToPosition(0); 
0

Tôi cũng gặp sự cố trên ICS.

Tôi có một hoạt động danh sách tin nhắn trò chuyện, mọi lúc sau khi tôi gửi tin nhắn, tôi cần phải cuộn chế độ xem danh sách xuống dưới một cách mượt mà. Vì vậy, sau khi tôi gọi là notifyDataSetChanged(), tôi đã gọi phương thức smoothScrollToPosition(). Trên các phiên bản xây dựng Android khác, nó hoạt động tốt. Nhưng trên ICS, nó rất lạ. Nếu listview của tôi là ở dưới cùng, tôi đã thử nghiệm 3 trường hợp.nếu tôi thêm một mục mới vào listview, nó sẽ không cuộn. Nếu tôi nối thêm hai mục mới vào chế độ xem danh sách -> nó sẽ cuộn tốt. Và nếu tôi cuộn listview lên một vài pixes, sau khi tôi thêm một mục mới, nó sẽ di chuyển tốt. Sau rất nhiều tìm kiếm và thử nghiệm trên google, tôi cảm thấy bất lực về điều này. Cuối cùng, mỗi khi tôi setdata để listview, tôi nối thêm một cái nhìn trống (1px) ở vị trí cuối cùng, mặc dù đây không phải là một phương pháp tốt, nhưng nó làm việc cho tôi.

2

Nếu mục tiêu của bạn là cuộn lên trên cùng, hãy xem xét sử dụng smoothScrollToPositionFromTop(0,0). thay thế.

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