三生大侠 猪猪侠 代码在这里

import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class StartMerchantActivity extends Activity {
private RecyclerView mRvDemoMain;
private Context context;
private MyRecyclerAdapter mAdapter;
protected List mList;
public static String[] URLS;
private static final String urlPath = "http://www.imooc.com/api/teacher?type=4&num=30";
//private static final String urlPath = "http://14.117.17.161/json.php";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.merchant);

    // 1. 初始化RecyclerView中要显示的数据
    initData();
    // 2. 初始化本页面的控件
    initView();

    mRvDemoMain = (RecyclerView) findViewById(R.id.merchant_recyclerview);
    new NewAsyncTask().execute(urlPath);
}

/**
 * 初始化RecyclerView中要显示的数据
 */
private void initData() {
    mList = new ArrayList<NewsBeam>();
    URLS = new String[mList.size()];
    for (int i = 0; i < mList.size(); i++) {
        URLS[i] = mList.get(i).newsIconUrl;
    }
}

/**
 * 初始化本页面的控件
 */
private void initView() {
    mRvDemoMain = (RecyclerView) findViewById(R.id.merchant_recyclerview);

    // 设置RecyclerView的Adapter
    mAdapter = new MyRecyclerAdapter(StartMerchantActivity.this,mList,mRvDemoMain);
    mRvDemoMain.setAdapter(mAdapter);

    // zz 测试
    System.out.println("==== mRvDemoMain.setAdapter(mAdapter)执行完了");

    mRvDemoMain.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL));
    mRvDemoMain.setItemAnimator(new DefaultItemAnimator());

    // 调用Adapter中的设置监听器的方法
    mAdapter.setOnItemClickListener(new MyRecyclerAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            Toast.makeText(StartMerchantActivity.this, "click : " + position, Toast.LENGTH_SHORT).show();
        }
    });
}

/**
 * 实现网络的异步访问
 */
class NewAsyncTask extends AsyncTask<String, Void, List<NewsBeam>>
{
    @Override
    protected void onPostExecute(List<NewsBeam> newsBeams)
    {
        super.onPostExecute(newsBeams);
        MyRecyclerAdapter adapter = new MyRecyclerAdapter(StartMerchantActivity.this, newsBeams, mRvDemoMain);
        mRvDemoMain.setAdapter(adapter);
    }

    @Override
    protected List<NewsBeam> doInBackground(String... params)
    {
        return getJsonData(params[0]);
    }


    /**
     * 从 URL 中获取数据
     *
     * @param url
     * @return
     */
    private List<NewsBeam> getJsonData(String url)
    {
        List<NewsBeam> newsBeamsList = new ArrayList<NewsBeam>();
        try
        {
            String jsonString = readStream(new URL(urlPath).openStream());

            JSONObject jsonObject;
            NewsBeam newsBeam;

            jsonObject = new JSONObject(jsonString);
            JSONArray jsonArray = jsonObject.getJSONArray("data");
            for(int i = 0; i < jsonArray.length(); i++)
            {
                jsonObject = jsonArray.getJSONObject(i);
                newsBeam = new NewsBeam();
                newsBeam.newsIconUrl = jsonObject.getString("picSmall");
                newsBeam.newsTitle = jsonObject.getString("name");
                newsBeamsList.add(newsBeam);
            }

        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        catch(JSONException e)
        {
            e.printStackTrace();
        }
        return newsBeamsList;
    }


    /**
     * 从 inpustStream 获取的信息
     *
     * @param is
     * @return
     */
    private String readStream(InputStream is)
    {
        InputStreamReader isr;
        String result = "";
        try
        {
            isr = new InputStreamReader(is, "utf-8");
            BufferedReader br = new BufferedReader(isr);
            String line = "";
            while((line = br.readLine()) != null)
            {
                result += line;
            }

        }
        catch(UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        return result;
    }
}

}

public class NewsBeam {
public String newsIconUrl;
public String newsTitle;
}

import android.content.Context;
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 java.util.ArrayList;
import java.util.List;

public class MyRecyclerAdapter extends RecyclerView.Adapter {
private LayoutInflater mInflater;
protected List mList;
private List mHeights; // 随机高度的集合
private ImgLoaderRecyclerView mImgLoaderRecyclerView;
private int mStart;
private int mEnd;
public static String[] URLS;
private boolean mFirstIn;

/**
 * 自定义一个OnItemClickListener的回调接口
 */
public interface OnItemClickListener{
    void onItemClick(View view, int position);
}

/**
 * 创建接口的成员变量
 */
private OnItemClickListener mOnItemClickListener;

/**
 * 设置监听器的方法
 * @param listener listener
 */
public void setOnItemClickListener(OnItemClickListener listener){
    this.mOnItemClickListener = listener;
}

/**
 * 构造方法
 * @param context context
 */
public MyRecyclerAdapter(Context context, List<NewsBeam> data,RecyclerView recyclerView) {
    this.mList = data;
    mImgLoaderRecyclerView = new ImgLoaderRecyclerView(recyclerView);
    mInflater = LayoutInflater.from(context);
    mHeights = new ArrayList<Integer>();
    for (int i = 0; i < mList.size(); i++) {
        mHeights.add((int) (150 + Math.random() * 150));
    }
    mFirstIn = true;
}

/**
 * RecyclerView中条目的数量
 *
 * @return count
 */
@Override
public int getItemCount() {
    return mList.size();
}

/**
 * 创建ViewHolder
 *
 * @param parent   parent
 * @param viewType viewType
 * @return holder
 */
@Override
public MyRecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // zz 测试
    System.out.println("====onCreateViewHolder : " + viewType + " == " + parent);

    View view = mInflater.inflate(R.layout.recycler_item, parent, false);
    MyRecyclerHolder mHolder = new MyRecyclerHolder(view);
    return mHolder;
}

/**
 * 绑定ViewHolder
 *
 * @param holder   holder
 * @param position position
 */
@Override
public void onBindViewHolder(final MyRecyclerHolder holder, final int position) {

    System.out.println("position"+position);

    // 为ViewHolder的父控件(也即一条Item)设置高度
    ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
    lp.height = mHeights.get(position);
    holder.itemView.setLayoutParams(lp);
    holder.mIvItem.setImageResource(R.mipmap.ic_launcher);
    String url = mList.get(position).newsIconUrl;
    holder.mIvItem.setTag(url);
    mImgLoaderRecyclerView.showImgByAysncTask(holder.mIvItem, url);
    holder.mTvItem.setText(mList.get(position).newsTitle);

    // 调用条目的点击事件设置方法
    setUpItemEvent(holder);

    // zz 测试
    System.out.println("====onBindViewHolder : " + position + " == " + holder);

}

/**
 * 设置条目的点击事件(点按)
 * @param holder holder
 */
protected void setUpItemEvent(final MyRecyclerHolder holder) {
    if (mOnItemClickListener != null) {
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int layoutPosition = holder.getLayoutPosition();
                mOnItemClickListener.onItemClick(holder.itemView, layoutPosition);
            }
        });
    }
}

/**
 * RecyclerView的ViewHolder类
 */
public class MyRecyclerHolder extends RecyclerView.ViewHolder {
    ImageView mIvItem;
    TextView mTvItem;

    public MyRecyclerHolder(View itemView) {
        super(itemView);
        mIvItem = (ImageView) itemView.findViewById(R.id.id_image);
        mTvItem = (TextView) itemView.findViewById(R.id.id_name);
    }
}

}

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.support.v7.widget.RecyclerView;
import android.util.LruCache;
import android.widget.ImageView;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashSet;
import java.util.Set;

public class ImgLoaderRecyclerView
{
private ImageView mImageView;
private String mUrl;

private LruCache<String, Bitmap> mCache;

private RecyclerView mRecyclerView;
private Set<NewsAynsTaskImgView> mtask;


public ImgLoaderRecyclerView(RecyclerView recyclerView)
{
    int maxMemory = (int) Runtime.getRuntime().maxMemory();     //获取最大可用内存
    int cacheSize = maxMemory / 4;
    mRecyclerView = recyclerView;
    mtask = new HashSet<NewsAynsTaskImgView>();
    mCache = new LruCache<String, Bitmap>(cacheSize)
    {
        @Override
        protected int sizeOf(String key, Bitmap value)
        {
            // 在每次存入缓存时调用
            return value.getByteCount();
        }
    };
}


/**
 * 增加到缓存
 *
 * @param url   图片的网站,也是图片的唯一标志
 * @param bitmap
 */
public void addBitmapToCache(String url, Bitmap bitmap)
{
    if(getBitmapFromCache(url) == null)
    {
        mCache.put(url, bitmap);
    }
}

/**
 * 从缓存中获取数据
 *
 * @param url
 * @return
 */
public Bitmap getBitmapFromCache(String url)
{
    return mCache.get(url);
}


private Handler mHandler = new Handler()
{
    @Override
    public void handleMessage(Message msg)
    {
        super.handleMessage(msg);

        if(mImageView.getTag().equals(mUrl))
        {
            mImageView.setImageBitmap((Bitmap) msg.obj);
        }
    }
};


/**
 * 线程方法加载图片
 *
 * @param imageView
 * @param url
 */
public void showImgByThread(ImageView imageView, final String url)
{
    mImageView = imageView;
    this.mUrl = url;

    new Thread()
    {
        public void run()
        {
            super.run();
            Bitmap bitmap = getBitmapFromURL(url);
            Message message = Message.obtain();
            message.obj = bitmap;
            mHandler.sendMessage(message);
        }
    }.start();
}


/**
 * 从网络中获取图片
 *
 * @param urlString 图片网址
 * @return 获取到的图片
 */
public Bitmap getBitmapFromURL(String urlString)
{
    Bitmap bitmap = null;
    InputStream is = null;
    try
    {
        URL url = new URL(urlString);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        is = new BufferedInputStream(conn.getInputStream());

        bitmap = BitmapFactory.decodeStream(is);
        conn.disconnect();
    }
    catch(MalformedURLException e)
    {
        e.printStackTrace();
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
    finally
    {
        try
        {
            is.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

    return bitmap;
}


/**
 * 展示图片 AysncTask() 这种方法
 */
public void showImgByAysncTask(ImageView imageView, String url)
{
    Bitmap bitmap = getBitmapFromCache(url);

    // 从缓存中取出对应的图片
    //如果没有,就从网线上下载图片
    if(bitmap == null)
    {
        imageView.setImageResource(R.mipmap.ic_launcher);
    }
    else        //有了,直接使用缓存的图片即可
    {
        imageView.setImageBitmap(bitmap);
    }

}

/**
 * 停止加载图片 ,滑动时
 */
public void cancelAllTasks()
{
    if(mtask != null)
    {
        for(NewsAynsTaskImgView task : mtask)
        {
            task.cancel(false);
        }
    }
}

private class NewsAynsTaskImgView extends AsyncTask<String, Void, Bitmap>
{
    //private ImageView mImageView;
    private String mUrl;

    public NewsAynsTaskImgView(String url)
    {
        //      mImageView = imageView;
        mUrl = url;
    }

    @Override
    protected Bitmap doInBackground(String... params)
    {
        String url = params[0];
        Bitmap bitmap = getBitmapFromURL(url);
        /**
         *  从网络获取图片
         */
        if(bitmap != null)
        {
            //把图片加入缓存
            addBitmapToCache(url, bitmap);
        }
        return bitmap;
    }

    @Override
    protected void onPostExecute(Bitmap bitmap)
    {
        super.onPostExecute(bitmap);
        ImageView imageView = (ImageView) mRecyclerView.findViewWithTag(mUrl);
        if(imageView.getTag().equals(mUrl) && bitmap != null)
        {
            imageView.setImageBitmap(bitmap);
        }
    }
}


/**
 * 加载指定的图片
 *
 * @param start 开始图片标志
 * @param end   结束图片标志
 */
public void loadImages(int start, int end)
{
    for(int i = start; i < end; i++)
    {
        String url = MyRecyclerAdapter.URLS[i];
        Bitmap bitmap = getBitmapFromCache(url);
        if(bitmap == null)
        {
            NewsAynsTaskImgView task = new NewsAynsTaskImgView(url);
            task.execute(url);
            mtask.add(task);
        }
        else        //有了,直接使用缓存的图片即可
        {
            ImageView imageView = (ImageView) mRecyclerView.findViewWithTag(url);
            imageView.setImageBitmap(bitmap);
        }
    }
}

}