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