android - 如何在用户快速滚动时延迟列表适配器中 View 的加载

标签 android listview

我的 ListView 中有从互联网下载的图像。 我想在 getView() 中添加一些内容,以便在用户快速滑动/滚动时它不会下载图像?

我怎样才能开始这样做?

最佳答案

您可以按照以下步骤延迟加载 ListView 中的 View 。

首先,您应该创建ListView 对象和YOUR_COSTOM_ADAPTER_OBJECT 类变量。 然后,为您的 ListView 设置一个 onScroll 监听器

从 ListView 的 onScroll 监听器获取滚动速度:
从您的 onScroll 监听器获取滚动速度,当速度变快时,告诉您的适配器不要加载图像。

示例代码:

class YourClass extends Activity
{
YOUR_CUSTOM_LISTVIEW_ADAPTER adapter;
ListView YOUR_LISTVIEW;
ArrayList<YOUR_DATA_TYPE> listViewData;

onCreate(...){
.....
.....
//ListView data Initialization
listViewData = new ArrayList<YOUR_DATA_TYPE>();
listViewData.clear();
YOUR_LISTVIEW = (ListView)findViewById(R.id.YOUR_LISTVIEW_ID);
//adapter Initialization
adapter = new YOUR_CUSTOM_LISTVIEW_ADAPTER(....);
YOUR_LISTVIEW.setAdapter(adapter);
}

private OnScrollListener onScrollListener = new OnScrollListener() {

private int previousFirstVisibleItem = 0;
private long previousEventTime = 0;
private double speed = 0;

@Override
public void onScroll(HtcAbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 
{
    if (previousFirstVisibleItem != firstVisibleItem)
    {
        long currTime = System.currentTimeMillis();
        long timeToScrollOneElement = currTime - previousEventTime;
        speed = ((double)1/timeToScrollOneElement)*1000;

        previousFirstVisibleItem = firstVisibleItem;
        previousEventTime = currTime;

        Log.d("DBG", "Speed: " +speed + " elements/second");

        //Tell adapter to not load images if it has reached a specific speed
        if(speed>YOUR_DESIRED_VALUE)
        {
            doNotLoadImagesInListView();
        }
        else
        {
            loadImagesInListView();
        }
    }
}

@Override
public void onScrollStateChanged(HtcAbsListView view, int scrollState) 
{
}
};

void doNotLoadImagesInListView()
{
    adapter.isScrollFast = true;
    adapter.notifyDataSetChanged();
    YOUR_LISTVIEW.setAdapter(adapter);
}

void loadImagesInListView()
{
    adapter.isScrollFast = false;
    adapter.notifyDataSetChanged();
    YOUR_LISTVIEW.setAdapter(adapter);
}


}


配置自定义列表适配器以进行相应更改:

public class yourCustomAdapter extends BaseAdapter
{
    public Boolean isScrollFast;

public yourCustomAdapter(..... , ....., Boolean isScrollFast)
{
    ....
    this.isScrollFast = isScrollFast;
    .....
}

@Override
public int getCount() 
{
    .....
}

@Override
public Object getItem(int position) 
{
    .....
}

@Override
public long getItemId(int position) 
{
    .....
}

@Override
public View getView(int position, View convertView, ViewGroup parent) 
{
    .......
    if(isScrollFast==true)
    {
        //Don't Load Images
    }
    else
    {
        //Load Images normally
    }

    return vi;
}
}

我希望这对你有用。

关于android - 如何在用户快速滚动时延迟列表适配器中 View 的加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18131959/

相关文章:

c# - MVVM跨安卓: value with binding not updated

android - Espresso : test startActivityForResult return RESULT_OK

Android - 相当于 UITableViewCell?

java - 如何设置可扩展大小的数组以防止空指针异常?

android - ListView 上方 ViewPager 中的 float 操作按钮

android - maven-metadata.xml 在构建时不断收到请求

java - 使用改造 2 分段上传失败

jquery - ListView 过滤器不过滤新项目

Java Wicket 表单 : Error serializing object class 'myClassName'

Android O - 通知 channel - 更改振动模式或声音类型