Android listview ленивая загрузка

Я хочу кое-что сделать. Я хочу сделать ленивую загрузку в ListView. Мой ListView содержит более 10 000 данных и только в TextView. поэтому я не могу загрузить все эти данные в первый раз, когда я запускаю активность списка. он неэффективен, поэтому я могу загрузить первые 20 или 30 элементов в списке. далее строки ListView загружаются, когда я просматриваю их. поэтому, когда я дойду до последнего индекса ListView по последнему индексу, я поставлю progressbar n, он заметит, что новые данные загружены, поэтому в это время новые данные будут загружаться с последним + 1 индексом. Как я могу это сделать?

Ответ 1

Вы можете добиться этого, используя бесконечную реализацию адаптера. Это точно делает то, что вы хотите. Вы также можете ограничить количество строк для обновления на прокрутку. Вот ссылка на него.

Android: реализация контрольной панели и "загрузка..." для бесконечного списка, например Android Market

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 вашего адаптера.
  • Уменьшите количество предупреждений о сборке мусора, которые вы получаете в журналах
  • Добавить функцию прокрутки (ограничить количество строк, которые будут обновлены за прокрутку)