Android ScrollView — это чрезвычайно медленный рендеринг imageviews

#android #imageview #scrollview #android-linearlayout

#Android #просмотр изображений #scrollview #android-linearlayout

Вопрос:

Я отображаю несколько просмотров изображений в своем макете, которые добавляются программно, кажется, все в порядке, за исключением самого scrollview … он прокручивается очень медленно и сильно отстает при прокрутке. что может быть причиной этого?

 <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <LinearLayout 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:id="@ id/jobs_container"
        >

    </LinearLayout>
</ScrollView>
  

РЕДАКТИРОВАТЬ: я следовал ЭТОМУ и успешно создал свой listview, но снова сам listview отстает при прокрутке. Я получаю источник imageview из веб-сервиса, так что в основном мой элемент строки выглядит следующим образом:

 public class RowItem {
    private String imageSrc;
    private String title;

    public RowItem(String src, String title)
    {
        this.imageSrc = src;
        this.title = title;
    }
    public String getImageSrc()
            {
        return this.imageSrc;
    }
    public void setImageSrc(String src)
    {
        this.imageSrc = src;
    }
    public String getTitle()
    {
        return this.title;
    }
    public void setTitle(String title)
    {
        this.title = title;
    }
}
  

В основном я получаю список объектов json, конвертирую их в RowItem, затем использую следующий код для генерации строк для listview:

 public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    RowItem rowItem = getItem(position);

    LayoutInflater mInflater = (LayoutInflater) context
        .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item, null);
        holder = new ViewHolder();
        holder.txtTitle = (TextView) convertView.findViewById(R.id.title);
        holder.imageView = (ImageView) convertView.findViewById(R.id.icon);
        convertView.setTag(holder);
    } else
        holder = (ViewHolder) convertView.getTag();
    holder.txtTitle.setText(rowItem.getTitle());
    String url = rowItem.getImageSrc();
    url = url.replace("~", DOMAIN);
    Picasso.with(context).load(url).into(holder.imageView);

    return convertView;
}
  

и это все еще очень сильно отстает .. есть идеи?

ОБНОВЛЕНИЕ: Я думаю, что просмотры изображений вызывают медленную прокрутку, потому что перед загрузкой изображений все проходит гладко, но после загрузки изображений это начинает замедляться, и при каждой прокрутке скрытые строки, которые будут показаны, перезагружают изображение снова. может ли это быть причиной?

Комментарии:

1. Если «прокрутка отстает», это просто означает, что вы блокируете основной поток пользовательского интерфейса в каком-то месте вашего кода, это не связано с самим ScrollView. Блокировка основного потока означает выполнение над ним слишком интенсивной работы с процессором. Это может быть связано с тем, что ваш список изображений очень длинный и не виртуализирован с помощью ListView, поэтому для рендеринга требуется некоторое время, или это может быть что-то совершенно не связанное с тем, что ваш код выполняет в основном потоке.

Ответ №1:

Вместо использования ScrollView вы должны использовать ListView, который обладает функциональностью прокрутки и автоматически расширяется по мере добавления элементов

На первом шаге вы должны определить макет следующим образом

  <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:id="@android:id/list"
            >

        </ListView>
    </LinearLayout>
  
  1. Внедрите пользовательский адаптер ListView с помощью метода getView()

    Просмотр getView (int position, просмотр convertView, родительская группа ViewGroup) { Просмотр v = convertView;

        if(v == null)
    
          v = View.inflate(context , R.layout.your_item_layout_containing_image);
    
        ImageView imageView = (ImageView)v.findViewByID(R.id.your_image_view_id);
    
        Picasso.with(context).load(image_url).into(imageView);
        return v;
      

    }

Picasso — это библиотека, которую вы можете скачать и использовать непосредственно для загрузки изображений, она обладает очень хорошими функциями

Комментарии:

1. Спасибо Муханнад, я уже использую Picasso, и это работает как шарм, я попробую это и опубликую ответ

2. Я столкнулся с той же проблемой, которую вы опубликовали в своем ответе в мои первые дни Android, но ListView — лучший вид, который вы будете использовать в приложениях Android, если вам нужна дополнительная информация о том, как использовать ListView, дайте мне знать

3. Я отредактировал свой вопрос, не могли бы вы, пожалуйста, проверить его и посмотреть, сможете ли вы найти проблему? заранее спасибо

4. не могли бы вы попробовать создать другую ссылку на представление, подобную следующей; View v= convertView ; и в конце метода возвращать v; вместо возврата convertView?