compile 'com.google.code.gson:gson:2.8.1'
compile 'com.android.support:recyclerview-v7:24.2.1'
加完依赖,我们需要封装okhttp
/**
* Created by YU on 2017/8/24.
*/
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);
}
}
});
}
});
}
}
/
还有RecyclerView需要添加的封装类
/**
* Created by YU on 2017/8/24.
*/
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);
}
}
}
/
当然还有基类1
public interface OnItemonclicklinear {
void onClickListener(View v,int position);
}
/
这些做完我们就要在主方法里做接口的解析了
public class MainActivity extends AppCompatActivity {
private List<Data.DataBean> list = new ArrayList<>();
private int page = 1;
private String url = "http://www.yulin520.com/a2a/impressApi/news/mergeList?sign=C7548DE604BCB8A17592EFB9006F9265&pageSize=20&gender=2&ts=1871746850&page=";
private RecyclerView recyclerView;
private SwipeRefreshLayout swipeRefreshLayout;
private RecyclerAdapter adapter;
private LinearLayoutManager linearLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
loadData();
}
//初始化数据
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();
}
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();
}
}
});
}
//设置适配器
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();
}
});
}
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());
图片用GIDE
Gide.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);
}
}
}
///
然后bean就不多说了
主布局
<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>