列表视图滚动不平滑

时间:2013-11-18 17:56:18

标签: android android-listview android-scrollview android-scroll

我有一个自定义列表视图,可以显示用户和照片 我从API中检索数据,它提供了JSON输出,

我的问题是列表视图不能平滑滚动,它会挂起一秒钟并滚动,它会重复相同直到我们到达终点。

我认为可能是因为我在UI线程上运行与网络相关的操作,但即使在完成加载后它仍会继续这样做?

我的自定义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 个答案:

答案 0 :(得分:7)

使用AsyncTask加载图片。只要您在UI线程中执行此类任务,滚动就不会顺畅。

看看this tutorial。它将帮助您了解您需要实现的内容,而无需其他库。另外请记住,在滚动时,行一直在重绘,没有真正的“完成”加载。您还可以考虑使用图像缓存,例如使用ConcurrentHashMap可以放置已加载的图片。

答案 1 :(得分:3)

对于Image Load,快速使用此lib,加载图像速度非常快 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();
        }
} });

添加到Adapter类

public static Boolean isScrolling = true;

答案 2 :(得分:2)

可能有很多原因导致ListView不能平滑滚动。您可以确保使用一些最佳实践,例如

  1. 使用Holder模式并重新使用列表适配器的getView()中的视图
  2. 使用一些异步图像加载库来下载您在ListView中显示的图像?对于例如Universal Image Loader
  3. 使用AsyncTask从网络下载JSON,所有与网络相关的处理都在单独的线程中完成。
  4. 一旦你确定你已经涵盖了上述内容,它应该可以正常运作。