Я хочу кое-что сделать. Я хочу сделать ленивую загрузку в ListView
. Мой ListView
содержит более 10 000 данных и только в TextView
. поэтому я не могу загрузить все эти данные в первый раз, когда я запускаю активность списка. он неэффективен, поэтому я могу загрузить первые 20 или 30 элементов в списке. далее строки ListView
загружаются, когда я просматриваю их. поэтому, когда я дойду до последнего индекса ListView
по последнему индексу, я поставлю progressbar n, он заметит, что новые данные загружены, поэтому в это время новые данные будут загружаться с последним + 1 индексом. Как я могу это сделать?
Android listview ленивая загрузка
Ответ 1
Вы можете добиться этого, используя бесконечную реализацию адаптера. Это точно делает то, что вы хотите. Вы также можете ограничить количество строк для обновления на прокрутку. Вот ссылка на него.
https://github.com/commonsguy/cwac-endless
Чтобы использовать его, вы расширяете EndlessAdapter, чтобы предоставить подробную информацию о том, как справиться с бесконечностью. В частности, вам необходимо предоставить строку View, независимую от любой из строк вашего фактического адаптера, которая будет использоваться в качестве заполнителя, в то время как вы, другими способами, загружаете фактические данные в свой основной адаптер. Затем, немного помогая вам, он плавно переходит в новые данные.
Ответ 2
Добавьте onScrollListener в ListView. Когда пользователь прокручивает список, проверьте, приближается ли ListView к его концу. Если да, то выберите дополнительные данные. В качестве примера:
public abstract class LazyLoader implements AbsListView.OnScrollListener {
private static final int DEFAULT_THRESHOLD = 10 ;
private boolean loading = true ;
private int previousTotal = 0 ;
private int threshold = DEFAULT_THRESHOLD ;
public LazyLoader() {}
public LazyLoader(int threshold) {
this.threshold = threshold;
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if(loading) {
if(totalItemCount > previousTotal) {
// the loading has finished
loading = false ;
previousTotal = totalItemCount ;
}
}
// check if the List needs more data
if(!loading && ((firstVisibleItem + visibleItemCount ) >= (totalItemCount - threshold))) {
loading = true ;
// List needs more data. Go fetch !!
loadMore(view, firstVisibleItem,
visibleItemCount, totalItemCount);
}
}
// Called when the user is nearing the end of the ListView
// and the ListView is ready to add more items.
public abstract void loadMore(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount);
}
Активность:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
ListView listView = (ListView) findViewById(R.id.listView);
listView.setOnScrollListener(new LazyLoader() {
@Override
public void loadMore(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// Fetch your data here !!!
}
});
}
}
Вы можете найти полную реализацию по этой ссылке
Ответ 3
//введите функцию вызова:
@Override
public View onCreateView(android.view.LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
ScrollListener scrollListener = new ScrollListener();
listView.setOnScrollListener(scrollListener);
}
и внутренний класс:
class ScrollListener implements OnScrollListener
{
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
int size = searchedPeople.size();
if(isScrolled && totalItemCount != 0 && size < totalPeoples)
{
if(firstVisibleItem + visibleItemCount >= totalItemCount)
{
yourfunction(size, size + limit); // call service in your functioin
isScrolled = false;
}
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState)
{
}
}
Ответ 4
Сделать списки быстрее:
- Уменьшите количество условий, используемых в
getView
вашего адаптера. - Уменьшите количество предупреждений о сборке мусора, которые вы получаете в журналах
- Добавить функцию прокрутки (ограничить количество строк, которые будут обновлены за прокрутку)