2012-12-19 30 views
16

Tôi đã được làm việc trên một ý tưởng ListView nơi nó tiếp tục di chuyển tự động không có tương tác người dùng và đó là hoàn toàn có thể làm được bằng cách sử dụng API android ví dụ smoothScrollToPositionFromTop.Infinite Auto Scroll ListView với Scroll Speed ​​Controlled

Tôi đã triển khai ListView BaseAdapter nơi nó tải các mục vĩnh viễn (gần như) để tự động lặp lại ListView.

Điều tôi muốn đạt được ở đây là giữ ListView cuộn vĩnh viễn với tốc độ nhất định (chậm) để làm cho các mục rõ ràng và dễ đọc trong khi cuộn xuống, tôi không chắc chắn nếu ListView là lựa chọn tốt nhất của tôi ở đây.

bên dưới là một đoạn trích về những gì tôi đang cố gắng làm. kết quả là tốt bằng cách nào đó nhưng nó không đủ mịn, tôi có thể cảm thấy các ListView flickers.

tôi cần phải cải thiện êm ái, hiệu quả và kiểm soát tốc độ

new Thread(new Runnable() { 

    @Override 
    public void run() { 
     int listViewSize = mListView.getAdapter().getCount(); 

     for (int index = 0; index < listViewSize ; index++) { 
      mListView.smoothScrollToPositionFromTop(mListViewA.getLastVisiblePosition() + 100, 0, 6000); 
      try { 
       // it helps scrolling to stay smooth as possible (by experiment) 
       Thread.sleep(60); 
      } catch (InterruptedException e) { 

      } 
     } 
    } 
}).start(); 
+1

Vì vậy, vấn đề là gì? Bạn đã đạt được chức năng này (cuộn vô hạn) nhưng muốn cải thiện độ mượt/hiệu quả/làm chậm nó xuống? – breadbin

+0

xác định "không đủ mượt". Điều này có thể là do phần bộ điều hợp của bạn, một số mục có thể tải chậm. – njzk2

+0

@breadbin: cập nhật, njzk2 "không đủ mượt" Tôi có nghĩa là tôi có thể nhìn thấy listview chậm lại và sau đó cuộn lại mà làm cho nó tụt lại. Tôi cần di chuyển để được một shot và mãi mãi. –

Trả lời

15

Tôi đề nghị, bộ điều hợp của bạn được triển khai một cách hiệu quả. do đó, mã này chỉ là cuộn listview

bạn cần phải thử một giá trị của biến

final long totalScrollTime = Long.MAX_VALUE; //total scroll time. I think that 300 000 000 years is close enouth to infinity. if not enought you can restart timer in onFinish() 

final int scrollPeriod = 20; // every 20 ms scoll will happened. smaller values for smoother 

final int heightToScroll = 20; // will be scrolled to 20 px every time. smaller values for smoother scrolling 

listView.post(new Runnable() { 
         @Override 
         public void run() { 
           new CountDownTimer(totalScrollTime, scrollPeriod) { 
            public void onTick(long millisUntilFinished) { 
             listView.scrollBy(0, heightToScroll); 
            } 

           public void onFinish() { 
            //you can add code for restarting timer here 
           } 
          }.start(); 
         } 
        }); 
+0

nó có vẻ là một giải pháp thanh lịch, tôi không phải ở máy phát triển của tôi ngay bây giờ để kiểm tra nó, tôi sẽ cho bạn biết ngay khi có thể. –

+3

không có nghi ngờ rằng bạn xứng đáng với tiền thưởng, nhưng có một mối quan tâm về 'ListView' trong adapter vô hạn của tôi, khi listview scrollBy có vẻ như' getView (...) 'không được gọi nên tôi thấy ô trống sau ô cuối cùng được cuộn, tôi có cần làm mất hiệu lực 'ListView' trong khi cuộn không? –

+0

Tôi đã viết một số ứng dụng thử nghiệm cho http://pastebin.com/9fUTuR1u Bạn đã đúng - scrollBy cuộn Listview theo cách không chính xác. Nhưng nó làm việc cho tôi trong ScrollView. BTW, nếu bạn có một số lượng nhỏ các mục trong chế độ xem danh sách, bạn có thể thêm tính mượt mà hơn để cuộn nếu bạn thử ScrollView với Linearlayout trong đó với tất cả các mục của bạn. – Berezovskyi

-1

Dưới đây là một vài gợi ý: Simulate onFling() programmatically instead of detecting it (Android)

Programmatically Fling ListView Android

Thật khó để tìm ra những gì bạn gọi đủ mịn trong trường hợp của bạn. Thông thường các vấn đề về độ mượt có liên quan đến việc sử dụng tối ưu các listviews và các sự cố trong bố trí ô hoặc xem tạo/tái chế bên trong phương thức getView của bộ điều hợp.

Bạn có use a placeholder không? Một điều quan trọng cần xem xét cũng là Drawables usage.

tôi không bao giờ đạt được những gì bạn đang tìm kiếm, nhưng một ý tưởng đơn giản mà nói đến cái tâm là:

  • tìm một cách để di chuyển quan điểm của vị trí số 1 hoặc 2.
  • sử dụng một vòng đệm bên trong bộ điều hợp của bạn. Ví dụ: giả sử bạn có 100 mục trong danh sách các mục của bạn. Sau đó, ở đầu, mục 0 của listview là mục 0 trong danh sách của bạn. Khi listview được cuộn lên 1 mục, thì mục 0 của listview sẽ trở thành mục 1 trong danh sách của bạn. Vì vậy, vấn đề sẽ không được cuộn nhưng đồng bộ hơn với di chuyển và hiển thị một danh sách vô tận của các mục.
+0

Cảm ơn bạn rất nhiều vì đã nỗ lực trả lời câu hỏi của tôi, hãy nói về nó: ** 1 ** liên kết đầu tiên sử dụng 'InstrumentationTestCase' mà tôi tin rằng tôi không thể sử dụng nó trong ứng dụng của mình nếu tôi sai). ** 2 ** liên kết khác không liên quan gì đến vấn đề của tôi, tôi đã vượt qua sự cố/triển khai cuộn tự động. ** 3 ** Có hoàn toàn tôi đang sử dụng người giữ chỗ. ** 4 ** Tôi không quan tâm đến việc thực hiện bộ điều hợp vô tận :) –

+0

điều gì làm chậm quá trình cuộn danh sách AutoView? –

+0

Bạn có thể thử cuộn bằng cách thay thế vị trí: http://developer.android.com/reference/android/widget/ListView.html#smoothScrollByOffset(int) – Snicolas

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