Бесконечный автоматический список прокрутки с контролируемой скоростью прокрутки
Я работаю над идеей ListView
, где она автоматически прокручивается без взаимодействия с пользователем, и это абсолютно выполнимо с использованием API-интерфейсов Android, например smoothScrollToPositionFromTop.
Я реализовал ListView BaseAdapter
, где он навсегда загружает элементы (почти), чтобы получить самозавершение без повторения ListView
.
То, что я хочу достичь здесь, - это сохранить прокрутку ListView
навсегда с определенной скоростью (медленной), чтобы сделать элементы четкими и читаемыми при прокрутке вниз, но я не уверен, что если ListView
- мой лучший выбор здесь.
ниже - фрагмент того, что я пытаюсь сделать. результат как-то хорош, но он не достаточно гладок, я чувствую, что ListView мерцает.
Мне нужно улучшить гладкость, эффективность и контроль скорости
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
Я предлагаю, что ваш адаптер реализован эффективным образом.
так что этот код просто свитки listview
вам нужно попробовать другие значения переменных
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();
}
});
Ответ 2
Вот несколько указателей: Имитировать onFling() программно, а не обнаруживать его (Android)
и Программно Fling ListView Android
Трудно понять, что вы называете достаточно гладким в своем деле. Обычно проблемы с гладкостью связаны с не оптимальным использованием списков и проблем в макетах ячеек или созданием/рециркуляцией представлений внутри метода адаптеров getView.
Вы используете местозаполнитель?
Важно также рассмотреть Использование Drawables.
Я никогда не добивался того, что вы ищете, но простая идея, которая приходит на ум:
- найдите способ прокрутки вида 1 позиции или 2.
- используйте кольцевой буфер внутри адаптера. Например, скажем, у вас есть 100 предметов в вашем списке предметов. Затем в начале элемент 0 списка представляет собой пункт 0 вашего списка. Когда listview прокручивается из 1 элемента, тогда элемент 0 списка listview должен стать элементом 1 в вашем списке. Таким образом, проблема не будет прокручиваться, а больше синхронизируется с прокруткой и отображением бесконечного списка элементов.