#android #listview #imageview
нужно загружать картинку в элементы listview, но так как элементов может быть много, загружать их все сразу не очень разумно, как сделать так, чтобы метод запускался только у тех жлементов, что на экране, пробовал так: list.setOnScrollListener(new AbsListView.OnScrollListener() { public void onScrollStateChanged(AbsListView view, int scrollState) { // Log.d(LOG_TAG, "scrollState = " + scrollState); } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { for(int i = firstVisibleItem; i <= visibleItemCount; i++){ element.get(i).loadCover(); } list.invalidate(); } }); но загружаются только первые 6 картинок, а дальше все
Ответы
Ответ 1
Для подобной(Относительно. Ленивая асинхронная загрузка изображений) есть маленькая библиотека https://github.com/thest1/LazyList Проблема вашего кода - вы считаете что visibleItemCount - общее кол-во элементов в адаптере, но это кол-во видимых элементов. Т.е. после шестого элемента вы запускаете цикл с параметром i=7;i<6. Можно сделать так. Хотя метод onScroll и плохо работает при быстрой прокрутке. public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if(((firstVisibleItem + visibleItemCount) == totalItemCount) && totalItemCount > 0)){ loadNewData(); } list.invalidate(); } или слегка поправить ваш код for(int i = firstVisibleItem; i <= (firstVisibleItem+visibleItemCount)&&i<=totalItemCount; i++){ element.get(i).loadCover(); }Ответ 2
загрузку картинок организовать стоит организовать в методе getView, так же стоит использовать паттерн ViewHolder для кэширования элементов списка. Вот небольшой пример как это можно организовать @Override public View getView(int position, View convertView, ViewGroup viewGroup) { ViewHolder viewHolder; //если convertView == null, // значит этот вью элемент еще ни разу не загружался, инфлэйтим его //и сохраняем во view holder if (convertView == null){ LayoutInflater inflater = (LayoutInflater) mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); //list_item - это ваш лэйаут для элемента списка convertView = inflater.inflate(R.layout.list_item, viewGroup, false); viewHolder = new ViewHolder(); //находим imageView и записываем во viewHolder viewHolder.imageView = (ImageView) convertView.findViewById(R.id.my_image); //сохраняем ссылку на viewholder в convertView convertView.setTag(viewHolder); } else { //convertView!=null - значит этот вью элемент уже загружался, можно его переиспользовать, достаем из него ссылку на viewHolder viewHolder = (ViewHolder) convertView.getTag(); } //загрузку картинки делаем с помощью библиотеки http://square.github.io/picasso/ , она же отвечает за кэширование Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(viewHolder.imageView); return convertView; } class ViewHolder{ ImageView imageView;}Ответ 3
Если загрузка картинки у вас запускается в методе getView адаптера, то будут загружаться только картинки элементов, отображающихся на экране. При скроле новые элементы отображаются и их картинки начинают загружаться. Никаких слушателей скрола тут не надо.
Комментариев нет:
Отправить комментарий