ListView滑動時不加載圖片

思路是:

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;
        }
    }


}


源碼下載:http://pan.baidu.com/s/1i4H4ReH


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章