首先是依赖:
//OKHttp
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
//日志拦截器
implementation 'com.squareup.okhttp3:logging-interceptor:3.11.0'
//gson解析
implementation 'com.google.code.gson:gson:2.8.5'
//Glide图片加载
implementation 'com.github.bumptech.glide:glide:4.8.0'
//Xrecyclerview
implementation 'com.jcodecraeer:xrecyclerview:1.5.9'
当导入依赖报错时,添加如下代码:
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
details.useVersion '28.0.0'//根据你的底下appcompat-v7版本
}
}
}
}
如下图:
activity_main.xml(两个按钮和一个XRecyclerView):
<?xml version="1.0" encoding="utf-8"?>
<TextView
android:id="@+id/shou"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="首页"
android:textSize="25sp"
/>
<TextView
android:id="@+id/Switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="切换"
android:layout_alignParentRight="true"
android:textSize="25sp"
/>
<com.jcodecraeer.xrecyclerview.XRecyclerView
android:id="@+id/XRecy"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/shou"
android:layout_marginTop="15dp"
></com.jcodecraeer.xrecyclerview.XRecyclerView>
MainActivity:
package com.example.week3_04;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.OrientationHelper;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.example.week3_04.Until.NewsBean;
import com.example.week3_04.ipresenter.IPresenterImp;
import com.example.week3_04.ivem.IView;
import com.jcodecraeer.xrecyclerview.XRecyclerView;
public class MainActivity extends AppCompatActivity implements View.OnClickListener,IView {
/**
* 首页
*/
private TextView mShou;
/**
* 切换
*/
private TextView mSwitch;
private XRecyclerView mXRecy;
private XRecyAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取资源ID
initView();
//设置XRecyclerView的刷新加载
initXRecy();
}
int mPage;
private void initXRecy() {
mPage=1;
//设置可刷新
mXRecy.setPullRefreshEnabled(true);
//设置可加载
mXRecy.setLoadingMoreEnabled(true);
//设置起始展示为列表格式
LinearLayoutManager manager = new LinearLayoutManager(this);
manager.setOrientation(OrientationHelper.VERTICAL);
mXRecy.setLayoutManager(manager);
mXRecy.setLoadingListener(new XRecyclerView.LoadingListener() {
@Override
public void onRefresh() {
mPage=1;
//数据加载
initData();
}
@Override
public void onLoadMore() {
initData();
}
});
initData();
}
IPresenterImp mIPresenterImp;
private void initData() {
//进行MVP--->将数据放入到P曾
String path="http://www.zhaoapi.cn/product/getCatagory";
mIPresenterImp.startRequest(path,NewsBean.class);
}
//获取资源ID
private void initView() {
mShou = (TextView) findViewById(R.id.shou);
mSwitch = (TextView) findViewById(R.id.Switch);
mSwitch.setOnClickListener(this);
mXRecy = (XRecyclerView) findViewById(R.id.XRecy);
mAdapter=new XRecyAdapter(this);
mXRecy.setAdapter(mAdapter);
mIPresenterImp=new IPresenterImp(this);
}
//设置初始布尔,---判断"切换"时展示不同格式
Boolean boo=true;
@Override
public void onClick(View v) {
switch (v.getId()) {
default:
break;
//切换按钮点击
case R.id.Switch:
initSwitch();
break;
}
}
private void initSwitch() {
if (boo){
//如果点击"切换"按钮,boo=true,数据展示位网格形式
GridLayoutManager manager = new GridLayoutManager(this, 2);
manager.setOrientation(OrientationHelper.VERTICAL);
mXRecy.setLayoutManager(manager);
}else {
//线性
LinearLayoutManager manager = new LinearLayoutManager(this);
manager.setOrientation(OrientationHelper.VERTICAL);
mXRecy.setLayoutManager(manager);
}
//此时boo值发生变化
boo=!boo;
}
/**
* 经过MVP得到数据
* @param o
*/
@Override
public void setData(Object o) {
if (o instanceof NewsBean){
NewsBean newsBean=(NewsBean)o;
if (mPage==1){
//刷新数据
mAdapter.setMjihe(newsBean.getData());
}else {
//加载数据
mAdapter.addMjihe(newsBean.getData());
}
mPage++;
//停止刷新、加载
mXRecy.loadMoreComplete();
mXRecy.refreshComplete();
}else {
Toast.makeText(this,"错误啦",Toast.LENGTH_LONG).show();
}
}
}
activity_adapter.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<ImageView
android:id="@+id/XRecy_Image"
android:layout_width="152dp"
android:layout_height="152dp" />
<TextView
android:id="@+id/XRecy_Title"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/XRecy_Price"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Adapter:
package com.example.week3_04;
import android.content.Context;
import android.support.annotation.NonNull;
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 com.bumptech.glide.Glide;
import com.example.week3_04.Until.NewsBean;
import com.jcodecraeer.xrecyclerview.XRecyclerView;
import java.util.ArrayList;
import java.util.List;
public class XRecyAdapter extends XRecyclerView.Adapter<XRecyclerView.ViewHolder> {
private Context mContext;
private List<NewsBean.DataBean> mjihe;
public XRecyAdapter(Context context) {
mContext = context;
mjihe=new ArrayList <>();
}
/**
* 刷新
* @param mjihe
*/
public void setMjihe(List <NewsBean.DataBean> mjihe) {
this.mjihe = mjihe;
notifyDataSetChanged();
}
/**
* 加载
* @param jihe
*/
public void addMjihe(List <NewsBean.DataBean> jihe){
mjihe.addAll(jihe);
notifyDataSetChanged();
}
/**
* 数据展示视图
* @param viewGroup
* @param i
* @return
*/
@NonNull
@Override
public XRecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view=LayoutInflater.from(mContext).inflate(R.layout.activity_adapter,viewGroup,false);
return new ViewHolder(view);
}
/**
* 获取数据以及条目、数据的其他操作(通过接口 删除、跳转...)
* @param viewHolder
* @param i
*/
@Override
public void onBindViewHolder(@NonNull XRecyclerView.ViewHolder viewHolder, int i) {
ViewHolder holder= (ViewHolder) viewHolder;
Glide.with(mContext).load(mjihe.get(i).getIcon()).into(holder.mImageView);
holder.mTextPrice.setText(mjihe.get(i).getName());
holder.mTextTitle.setText(mjihe.get(i).getCreatetime());
}
@Override
public int getItemCount() {
return mjihe.size();
}
class ViewHolder extends XRecyclerView.ViewHolder{
ImageView mImageView;
TextView mTextTitle;
TextView mTextPrice;
public ViewHolder(@NonNull View itemView) {
super(itemView);
//初始化:
mImageView=itemView.findViewById(R.id.XRecy_Image);
mTextTitle=itemView.findViewById(R.id.XRecy_Title);
mTextPrice=itemView.findViewById(R.id.XRecy_Price);
}
}
}
OKhttp:
package com.example.week3_04.Until;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
public class OKHttpUntil {
/**
* 1.单例
*/
private static OKHttpUntil instance;
private final OkHttpClient mClient;
private HttpLoggingInterceptor mInterceptor;
public static OKHttpUntil getInstance(){
if (instance==null){
synchronized (OKHttpUntil.class){
if (null==instance){
instance=new OKHttpUntil();
}
}
}
return instance;
}
private OKHttpUntil(){
//日志拦截器
mInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Log.i("TAG","message="+message);
}
});
mInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
/**
* 2.客户端
*/
mClient = new OkHttpClient.Builder()
.connectTimeout(10,TimeUnit.SECONDS)
.writeTimeout(10,TimeUnit.SECONDS)
.readTimeout(10,TimeUnit.SECONDS)
.addInterceptor(mInterceptor)
.build();
}
/**
* 3.接口
*/
public interface CallBack{
void fail(Exception e);
void success(Object o);
}
/**
* 4.get异步
*/
Handler mHandler=new Handler(Looper.getMainLooper());
public void getEnquene(String path, final Class clazz, final CallBack callBack){
Request request = new Request.Builder().get().url(path).build();
Call call = mClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
mHandler.post(new Runnable() {
@Override
public void run() {
callBack.fail(e);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try {
String string = response.body().string();
Gson gson = new Gson();
final Object o = gson.fromJson(string, clazz);
mHandler.post(new Runnable() {
@Override
public void run() {
callBack.success(o);
}
});
}catch (Exception e){
e.printStackTrace();
}
}
});
}
}