#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>
-
Внедрите пользовательский адаптер 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?