这里这个小Demo里面主要有OKHttp,
RecyclerView,picasso等开源库及网络框架;
首先添加需要用到的依赖:
compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.squareup.okhttp3:okhttp-ws:3.4.2'
compile 'com.google.code.gson:gson:2.6.1'
权限:
<uses-permission android:name="android.permission.INTERNET"/>主布局:
<android.support.v4.widget.SwipeRefreshLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/swipeRefreshLayout"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/recyclerView"/> </android.support.v4.widget.SwipeRefreshLayout>item布局就不说了 就一个图片
主方法:
public class MainActivity extends AppCompatActivity {
//获取的json数据中的数据集合
private List<RootBean.美女Bean> list = new ArrayList<>();
//创建一个list集合存储recyclerview中的图片的高度
private List<Integer> heights = new ArrayList<>();
//声明recyclerview引用
private RecyclerView mRecyclerView;
//声明自定义请求类
private MyAdapter adapter;
private SwipeRefreshLayout swipeRefreshLayout;
//用插件自动生成初始化view代码的方法
private void assignViews() {
mRecyclerView= (RecyclerView) findViewById(R.id.recyclerView);
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);
//设置recyclerview要实现的类型为StaggeredGrid瀑布流类型
//并再构造方法中指定列数3,纵向排列
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,RecyclerView.VERTICAL));
}
int page=0;
//网络请求数据的网址
private String url ="http://c.3g.163.com/recommend/getChanListNews?channel=T1456112189138&size=20&passport=&devId=1uuFYbybIU2oqSRGyFrjCw%3D%3D&lat=%2F%2FOm%2B%2F8ScD%2B9fX1D8bxYWg%3D%3D&lon=LY2l8sFCNzaGzqWEPPgmUw%3D%3D&version=9.0&net=wifi&ts=1464769308&sign=bOVsnQQ6gJamli6%2BfINh6fC%2Fi9ydsM5XXPKOGRto5G948ErR02zJ6%2FKXOnxX046I&encryption=1&canal=meizu_store2014_news&mac=sSduRYcChdp%2BBL1a9Xa%2F9TC0ruPUyXM4Jwce4E9oM30%3D";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件
assignViews();
//开启网络下载数据的方法
startTask();
//上拉刷新
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
page ++;
loadData();
adapter.notifyDataSetChanged();
swipeRefreshLayout.setRefreshing(false);
}
});
}
private void loadData() {
Toast.makeText(MainActivity.this,"下拉刷新",Toast.LENGTH_LONG).show();
String img = list.get(0).img;
adapter.addData(img);
}
private void startTask() {
//通过类名直接调用静态方法获取单例对象再调用getBeanOfOK()方法传入参数通过接口回调获取数据
OkHttpUtils.getInstance().getBeanOfOk(this, url, RootBean.class,
new OkHttpUtils.CallBack<RootBean>() {
@Override
public void getData(RootBean rootBean) {
if(rootBean!=null){
//如果不为空用本地list接收
list.addAll(rootBean.美女);
//数据一旦回调成功初始化数据源和适配器
initHights();
initAdapter();
}
}
});
}
private void initAdapter() {
//创建自定义适配器对象
adapter = new MyAdapter(this,list,heights);
//设置recyclerview适配器
mRecyclerView.setAdapter(adapter);
//设置动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
//刷新适配器
// adapter.notifyDataSetChanged();
adapter.setOnItemClickListener(new MyAdapter.onItemClickListener() {
@Override
public void onItemclic(View view, int data) {
Toast.makeText(MainActivity.this,data+"",Toast.LENGTH_SHORT).show();
}
});
}
private void initHights() {
//设置随机数
Random random = new Random();
for (int i = 0; i < list.size(); i++) {
//集合中存储每个回调图片对应的随机高度
heights.add(random.nextInt(200)+200);
}
}
}
OKHttpUtils:
//OkHttpUtils工具类,用于 用OkHttp框架获取网络数据并通过添加范型的静态方法返回不同
//bean对象的数据
public class OkHttpUtils {
//声明OkHttpClient引用
private OkHttpClient client;
//私有化构造方法
private OkHttpUtils(){
//创建client对象只在创建OkHttpUitls对象时创建一次
client = new OkHttpClient();
}
//声明静态OkHttpUtils引用
private static OkHttpUtils utils;
//单例设计模式让外部始终获得的是一个OkHttpUtils对象
public static OkHttpUtils getInstance() {
//双重判断加上同步锁可以解决线程安全问题
if(utils==null){
synchronized (OkHttpUtils.class){
if(utils==null){
//一旦判断没有创建过此类的对象就创建一次并返回
utils = new OkHttpUtils();
return utils;
}
}
}
return utils;
}
//定义一个callback接口并定义范型(适用于任意类的返回对象)用于接口回调
interface CallBack<T>{
//定义回调方法
void getData(T t);
}
//创建万能的数据请求类,形参为四个activity对象,网址url,和得到数据的bean类为范型的class对象,实现接口的类对象
public <T extends Object>void getBeanOfOk(final Activity activity, String url, final Class<T> clazz, final CallBack<T> callback){
//创建request请求对象,设置其方式get,网址url
Request request = new Request.Builder().get().url(url).build();
//通过client的newCall方法传入request,并调用enqueue求求数据
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//通过返回的response对象的body()和string()方法得到获取的json字符串
String json = response.body().string();
//通过Gson解析得到解析后任意类对象
final T t = new Gson().fromJson(json,clazz);
//由于子线程中不能更新UI所以我们用activity对象调用方法回到主线程
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
if(t!=null){
//并用过接口回调传回数据
callback.getData(t);
}
}
});
}
});
}
}
适配器:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
//声明两个集合用于接受构造方法传来的参数在本地使用
private List<RootBean.美女Bean> list;
private List<Integer> heights;
//声明上下文引用,用于加载布局文件
private Context context;
//用构造方法传入需要的参数,
public MyAdapter(Context context, List<RootBean.美女Bean> list, List<Integer> heights) {
this.context = context;
this.list = list;
this.heights = heights;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//返回MyViewHolder对象,通过构造方法传入加载布局文件得到的view对象
return new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.item, parent, false));
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
//通过itemview得到每个图片的pararms对象
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) holder.itemView.getLayoutParams();
//将高度修改为传入的随机高度
params.height = heights.get(position);
//设置修改参数
holder.itemView.setLayoutParams(params);
// holder.iv.setImageResource(R.mipmap.ic_launcher);
//用过Picasso框架对图片处理并显示到iv上
//用with()方法初始化,,
Picasso.with(context)
//load()下载图片
.load(list.get(position).img)
//下载中显示的图片
.placeholder(R.mipmap.ic_launcher)
//下载失败显示的图片
.error(R.mipmap.ic_launcher)
//init()显示到指定控件
.into(holder.iv);
ObjectAnimator
.ofFloat(holder.iv,"alpha",0.0f,1.0f)
.setDuration(2000)
.start();
}
@Override
public int getItemCount() {
//返回数据源大小
return list.size();
}
public void addData(String img) {
RootBean.美女Bean 美女Bean = list.get(0);
美女Bean.img=img;
list.add(0,美女Bean);
}
//自定义MyViewHolder类用于复用
class MyViewHolder extends RecyclerView.ViewHolder {
//声明imageview对象
private ImageView iv;
//构造方法中初始化imageview对象
public MyViewHolder(View itemView) {
super(itemView);
iv = itemView.findViewById(R.id.image);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(monItemClickListener!=null){
monItemClickListener.onItemclic(v,getLayoutPosition());
}
}
});
}
}
//点击事件recycleview点击事件的接口
interface onItemClickListener{
/**
* 抽象方法,当recycleview某个被点击的时候回调
* @param view 点击的item对象
* @param data 点击时的数据
*/
void onItemclic(View view,int data);
}
//创建接口
private onItemClickListener monItemClickListener;
//设置recycleview的某个监听
public void setOnItemClickListener(onItemClickListener onItemClickListener){
monItemClickListener=onItemClickListener;
}
}
这里有JavaBean类,就不需要写了;