Прокрутка списка не гладкая
У меня есть пользовательский вид списка, который отображает пользователей, и там фотографии, которые я получаю данные из API, который дает вывод JSON,
Моя проблема в том, что представление списка не прокручивается плавно, оно висит на секунду и прокручивает, оно повторяется до тех пор, пока мы не достигнем конца.
я думал, что это может быть мне, потому что я выполняю операцию, связанную с сетью, в потоке пользовательского интерфейса, но он продолжает делать это даже после завершения загрузки?
структура моего пользовательского ListView
<TextView style="@style/photo_post_text"
android:id="@+id/photo_post_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="demotext"
/>
<ImageView
android:id="@+id/userimage"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scaleType="fitXY"
android:adjustViewBounds="true"
android:src="@drawable/pi"
/>
3 ответа
Используйте AsyncTask для загрузки ваших фотографий. Прокрутка не будет гладкой, пока вы выполняете такие задачи в потоке пользовательского интерфейса.
Взгляните на этот урок. Это поможет вам понять, что вам нужно реализовать без необходимости в дополнительных библиотеках. Также имейте в виду, что строки перерисовываются все время, пока вы прокручиваете, нет никакой реальной "загрузки" загрузки. Вы можете дополнительно рассмотреть кэш изображений, например, с помощью ConcurrentHashMap, в который вы можете поместить загруженные изображения.
Для Image Load быстро используйте эту библиотеку, это очень быстро для загрузки изображений https://github.com/bumptech/glide
Для гладкой прокрутки представления списка используйте strictMode .IT запись в методе onCreate().
protected void onCreate(Bundle savedInstanceState) {
//StrictMode for smooth list scroll
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*-----
ListView
Custom Adapter set data....
------*/}
больше вещей, которые нужно добавить в метод onCreate()
listView.setOnScrollListener(new OnScrollListener() {
public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCoun) {
}
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState != 0)
listView.getAdapter()).isScrolling = true;
else {
adapter.isScrolling = false;
adapter.notifyDataSetChanged();
}
} });
добавить в класс адаптера
public static Boolean isScrolling = true;
Причин не слишком плавной прокрутки ListView может быть немало. Вы можете убедиться, что вы используете некоторые из лучших практик, таких как
- Использовать шаблон Holder и повторно использовать виды в
getView()
адаптера списка - Использовать некоторую асинхронную библиотеку загрузки изображений для загрузки изображений, которые вы отображаете в ListView? Например, универсальный загрузчик изображений
- использование
AsyncTask
чтобы загрузить JSON из сети, вся обработка, связанная с сетью, выполняется в отдельном потоке.
Как только вы убедитесь, что вы охватили все вышесказанное, это должно работать хорошо.