思路是:
listview(Demo中是RecyclerView,但基本一致)在滑動時不直接執行加載圖片的,已任務的方式存入一個隊列中,待滾動停止後在執行任務,下面是主要代碼實現
MainActivity中
package com.yu.listviewloadimg;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.AbsListView;
import com.yu.listviewloadimg.adapter.BaseAdapter;
import com.yu.listviewloadimg.bean.User;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private LinearLayoutManager mLinearLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
setUpRecyclerView();
}
private void setUpRecyclerView() {
mRecyclerView.setAdapter(new BaseAdapter(new ArrayList<User>(){{
add(new User("user1","http://img15.3lian.com/2015/c1/83/d/29.jpg"));
add(new User("user2","http://img0.pcgames.com.cn/pcgames/1410/09/4411520_7.jpg"));
add(new User("user3","http://b.hiphotos.baidu.com/zhidao/pic/item/38dbb6fd5266d016283711a5952bd40735fa3514.jpg"));
add(new User("user4","http://pic.baike.soso.com/p/20120714/20120714111118-1620671159.jpg"));
add(new User("user5","http://pic12.nipic.com/20110224/6715062_171738237111_2.jpg"));
add(new User("user6","http://c.hiphotos.baidu.com/zhidao/pic/item/64380cd7912397dd0bd012915b82b2b7d1a287fe.jpg"));
add(new User("user7","http://img.9ku.com/geshoutuji/singertuji/3/31589/31589_10.jpg"));
add(new User("user8","http://cdn.duitang.com/uploads/item/201307/22/20130722141354_PiAkC.jpeg"));
add(new User("user9","http://img4.duitang.com/uploads/item/201212/26/20121226192117_JQtrn.thumb.600_0.jpeg"));
add(new User("user10","http://a3.att.hudong.com/11/15/01300000921826141456155459645_s.jpg"));
add(new User("user11","http://images.china.cn/attachement/jpg/site1000/20100905/0019b91ecbef0ded36e72a.jpg"));
add(new User("user12","http://pic.87g.com/upload/2016/0302/20160302110114798.jpg"));
add(new User("user13","http://www.manhuacheng.com/uploadfile/2013/0115/20130115115017544.jpg"));
add(new User("user14","http://pic.87g.com/upload/2016/0302/20160302110105404.jpg"));
add(new User("user15","http://img4.duitang.com/uploads/item/201308/14/20130814141332_N8BnH.jpeg"));
add(new User("user16","http://pic.87g.com/upload/2016/0310/20160310113633254.jpg"));
add(new User("user17","http://t1.niutuku.com/960/43/43-83819.jpg"));
add(new User("user18","http://img5.duitang.com/uploads/item/201602/29/20160229174220_4fyEA.jpeg"));
add(new User("user19","http://pic.87g.com/upload/2016/0302/20160302110053858.jpg"));
add(new User("user20","http://img.article.pchome.net/00/58/83/22/pic_lib/s960x639/Xinshiji02s960x639.jpg"));
add(new User("user21","http://f.hiphotos.baidu.com/zhidao/pic/item/3c6d55fbb2fb431678c66f3922a4462308f7d393.jpg"));
}},this));
mLinearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
mRecyclerView.setLayoutManager(mLinearLayoutManager);
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
switch (newState) {
case AbsListView.OnScrollListener.SCROLL_STATE_IDLE://滑動停止
((BaseAdapter)recyclerView.getAdapter()).doTask(
mLinearLayoutManager.findFirstVisibleItemPosition(), mLinearLayoutManager.findLastVisibleItemPosition());
break;
case AbsListView.OnScrollListener.SCROLL_STATE_FLING:
case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
((BaseAdapter)recyclerView.getAdapter()).mCanLoadImg = false;
break;
}
}
});
}
}
Adapter.java
package com.yu.listviewloadimg.adapter;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.yu.listviewloadimg.R;
import com.yu.listviewloadimg.bean.User;
import com.yu.listviewloadimg.util.ImageUtil;
import com.yu.listviewloadimg.util.LogUtils;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* Created by Yu xiangxin on 2016/9/11 - 16:12.
*
* @desc ${TODD}
*/
public class BaseAdapter extends RecyclerView.Adapter<BaseAdapter.ViewHolder> {
private final ArrayList<User> mDatas = new ArrayList<>();
private final Context mContext;
public boolean mCanLoadImg = true;
private TaskQueue mTaskQueue = new TaskQueue(8);//根據實際情況給出大小
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
}
};
private java.lang.String TAG = "BaseAdapter";
public BaseAdapter(List<User> datas, Context context) {
this.mDatas.addAll(datas);
this.mContext = context;
}
@Override
public BaseAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.user_list_item, null));
}
@Override
public void onBindViewHolder(final BaseAdapter.ViewHolder holder, int position) {
ArrayList<myRunnable> itemTask = null;
final User user = mDatas.get(position);
if (mCanLoadImg) {
ImageUtil.loadImage(holder.imgIv, user.getUserIcon());
} else {
holder.imgIv.setImageResource(R.drawable.default_img);//設置默認的圖片
itemTask = new ArrayList<>();
itemTask.add(new myRunnable(position) {
@Override
public void run() {
ImageUtil.loadImage(holder.imgIv, user.getUserIcon());
}
});
/**
* 其他圖片
* itemTask.add...
*/
}
holder.nameTv.setText(user.getName());
mTaskQueue.addTask(itemTask);
}
@Override
public int getItemCount() {
return mDatas.size();
}
public void doTask(int firstVisibleItemPosition, int lastVisibleItemPosition) {
mCanLoadImg = true;
mTaskQueue.doTask(firstVisibleItemPosition, lastVisibleItemPosition);
}
class ViewHolder extends RecyclerView.ViewHolder {
TextView nameTv;
ImageView imgIv;
public ViewHolder(View itemView) {
super(itemView);
nameTv = (TextView) itemView.findViewById(R.id.name_tv);
imgIv = (ImageView) itemView.findViewById(R.id.img_iv);
}
}
private class TaskQueue extends LinkedList<ArrayList<myRunnable>> {
int maxTask = 1;
public TaskQueue(int maxTask) {
this.maxTask = maxTask;
}
public boolean addTask(ArrayList<myRunnable> task) {
if (task == null || task.size() == 0)
return false;
LogUtils.v(TAG, ""+"添加任務" + task.get(0).position);
if (size() >= maxTask) {
removeFirst();
}
super.addLast(task);
return true;
}
public void doTask(int startPosition, int lastPosition) {
while (size() != 0) {
for (myRunnable runnable : removeFirst()) {
if (runnable.position >= startPosition && runnable.position <= lastPosition) {
mHandler.postDelayed(runnable, 10);
}
}
}
}
}
public abstract class myRunnable implements Runnable {
public int position = -1;
public myRunnable(int position) {
this.position = position;
}
}
}