布局文件:
<android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipe" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="wrap_content"></android.support.v7.widget.RecyclerView> </android.support.v4.widget.SwipeRefreshLayout>
我们需要二次封装下okhttp请求:
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接口并定义范型(适用于任意类的返回对象)用于接口回调 public 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); } } }); } }); } }
然后就是在MainActivity中调用它请求接口:
private void loadData() { //通过类名直接调用静态方法获取单例对象再调用getBeanOfOK()方法传入参数通过接口回调获取数据 OkHttpUtils.getInstance().getBeanOfOk(this, url + page, Data.class, new OkHttpUtils.CallBack<Data>() { @Override public void getData(Data testBean) { Log.i("===", "getData: " + testBean.toString()); if (testBean != null) { //如果不为空用本地list接收 list.addAll(testBean.getData()); //数据一旦回调成功初始化数据源和适配器 initAdapter(); } } }); }然后是在MainActivity中new适配器的方法:
//设置适配器 public void initAdapter() { adapter = new RecyclerAdapter(list, this); recyclerView.setAdapter(adapter); adapter.setOnItemonclicklinear(new OnItemonclicklinear() { @Override public void onClickListener(View v, int position) { Data.DataBean bean = list.get(position); Toast.makeText(MainActivity.this, bean.getUserName(), Toast.LENGTH_SHORT).show(); } }); }然后在MainActivity中设置上拉加载下拉刷新:
private void initData() { //上拉刷新 swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { page ++; loadData(); adapter.notifyDataSetChanged(); swipeRefreshLayout.setRefreshing(false); } }); //下拉加载 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); int lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition(); if (lastVisibleItemPosition==list.size()-1){ page++; loadData(); adapter.notifyDataSetChanged(); } } }); }然后是适配器:
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private List<Data.DataBean> list; private Context context; private OnItemonclicklinear onItemonclicklinear; public void setOnItemonclicklinear(OnItemonclicklinear onItemonclicklinear) { this.onItemonclicklinear = onItemonclicklinear; } public RecyclerAdapter(List<Data.DataBean> list, Context context) { this.list = list; this.context = context; } //加载布局。 @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = null; RecyclerView.ViewHolder viewHolder = null; view = LayoutInflater.from(context).inflate(R.layout.item, null); viewHolder = new myViewHolder(view); return viewHolder; } //赋值 @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { Data.DataBean bean=list.get(position); // name, occupation, age, introduction; final myViewHolder myViewHolder= (myViewHolder) holder; myViewHolder.occupation.setText(bean.getOccupation()); myViewHolder.age.setText(bean.getUserAge()+"岁"); myViewHolder.introduction.setText(bean.getIntroduction()); myViewHolder.name.setText(bean.getUserName()); Glide.with(context).load(bean.getUserImg()).into(myViewHolder.imageView); //监听事件回调 myViewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { onItemonclicklinear.onClickListener(myViewHolder.itemView,position); ObjectAnimator animator=ObjectAnimator.ofFloat(myViewHolder.itemView,"alpha",0.0f,1.0f).setDuration(1000); animator.start(); } }); } @Override public int getItemCount() { return list != null ? list.size() : 0; } static class myViewHolder extends RecyclerView.ViewHolder { TextView name, occupation, age, introduction; ImageView imageView; public myViewHolder(View itemView) { super(itemView); name = (TextView) itemView.findViewById(R.id.name); age = (TextView) itemView.findViewById(R.id.age); occupation = (TextView) itemView.findViewById(R.id.occupation); introduction = (TextView) itemView.findViewById(R.id.introduction); imageView = (ImageView) itemView.findViewById(R.id.iamge); } } }在适配器里的OnItemonclicklinear需要创建一个类:
public interface OnItemonclicklinear { void onClickListener(View v,int position); }还有在MainActivity中初始化数据//初始化数据 private void initView() { recyclerView = (RecyclerView) findViewById(R.id.recyclerview); swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe); //线性布局管理及设置 linearLayoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(linearLayoutManager); recyclerView.addItemDecoration(new ItemDecration(this)); initData(); }初始化ItemDecration类
public class ItemDecration extends RecyclerView.ItemDecoration { private int with; private Context context; public ItemDecration(Context context) { this.context = context; DisplayMetrics displayMetrics = new DisplayMetrics(); ((Activity) context).getWindow().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); with = displayMetrics.widthPixels; } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDraw(c, parent, state); Paint paint = new Paint(); paint.setColor(Color.RED); int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View view = parent.getChildAt(i); int bottom=view.getBottom(); c.drawLine(0,bottom,with,bottom,paint); } } }