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

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

 gideon22 мая 2012 г., 08:03
Не могли бы вы показать, что вы пытались?
 Jai22 мая 2012 г., 08:14
да, я добавил изображение здесь в качестве примера .. проверить этот
 phi20 авг. 2015 г., 10:38
Как насчет Пикассо? Это отвечает вашим потребностям?square.github.io/picasso

Ответы на вопрос(4)

Решение Вопроса

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

Android: реализация индикатора выполнения и & quot; загрузка ... & quot; для бесконечного списка, как Android Market

https://github.com/commonsguy/cwac-endless

Чтобы использовать его, вы расширяете EndlessAdapter, чтобы предоставить подробную информацию о том, как обрабатывать бесконечность. В частности, вы должны быть в состоянии предоставить представление строк, независимое от любых строк в вашем фактическом адаптере, которое будет служить заполнителем, в то время как вы, в другом методе, загружаете фактические данные в ваш основной адаптер. Затем, с небольшой помощью от вас, он плавно переходит в новые данные.

 13 нояб. 2016 г., 18:57
Ссылка не работает сейчас! :(
 Jai22 мая 2012 г., 08:15
Спасибо, чувак, позволь мне попробовать это.
 10 мар. 2019 г., 09:27
неработающей ссылке....

Добавить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 !!!
                }
            });
        }
    }

Вы можете найти полную реализациюпо этой ссылке

// положить в вызывающую функцию:

@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)
    {

    }

}

Make your lists scroll faster:-

Reduce the number of conditions used in the getView of your adapter. Reduce the number of garbage collection warnings that you get in the logs Add scroll function (restrict the number of rows to be refreshed per scroll)

Ваш ответ на вопрос