电商项目
首先说一下需要导入的依赖
注意 : 我这里使用的是androidx
分别是Gson依赖,tablayout依赖,recycleView依赖 等
//frseo
implementation 'com.facebook.fresco:fresco:2.3.0'
implementation 'androidx.recyclerview:recyclerview:1.1.0' //RecyclerView
implementation 'com.jakewharton:butterknife:10.2.3' //butterknife
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'
implementation("com.squareup.okhttp3:okhttp:4.8.1") //okhttp
implementation("com.squareup.okhttp3:logging-interceptor:4.8.1") //日志拦截依赖
implementation 'com.squareup.retrofit2:retrofit:2.6.0' //retrofit
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' //rxjava
implementation 'com.squareup.retrofit2:converter-gson:2.1.0' //gson 转换
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' //rxandroid
implementation 'org.greenrobot:eventbus:3.2.0' //EventBus
//二维码继承
implementation 'cn.yipianfengye.android:zxing-library:2.2'
//Gson添加依赖
implementation 'com.google.code.gson:gson:2.8.5'
接下来就是基类的抽取
IBaseView类只是一个接口
这是BaseIPresenter也就是Presenter的基类抽取
public class BasePresenter<V extends IBaseView> {
public V mView;
//绑定
public void attachView(V view) {
mView = view;
}
//解绑
public void deatchView() {
mView = null;
}
}
这是BaseActivity也就是Activity的基类抽取(这里面我们不需要用这个来表示数据)
public abstract class BaseActivity
extends Activity implements IBaseView {
protected P presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(layoutID());
//初始化控件
initView();
//初始化presenter
presenter = initPresenter();
//绑定控件
presenter.attachView(this);
//初始化数据
initData();
}
protected abstract void initData();
protected abstract P initPresenter();
protected abstract void initView();
protected abstract int layoutID();
//解绑
@Override
protected void onDestroy() {
super.onDestroy();
if (presenter != null) {
presenter.deatchView();
}
}
现在开始mvp的封装
首先是契约类
public interface IMainContract {
interface IMainView extends IBaseView {
void setData(String json);
}
interface IMainPresenter {
void getHomeData();
}
}
接着是mvp中的presenter层
public class MainPresenter extends BasePresenter<IMainContract.IMainView> implements IMainContract.IMainPresenter {
private OkHttpUtils mOkHttpUtils;
public MainPresenter() {
mOkHttpUtils = OkHttpUtils.getInstance();
}
@Override
public void getHomeData() {
mOkHttpUtils.doGet(Api.STUDIO_URL, new OkHttpUtils.OkHttpCallBack() {
@Override
public void onResponse(String json) {
mView.setData(json);
}
});
}
}
从这里开始写工具类OkHttpUtils
public class OkHttpUtils {
private final Handler mHandle;
private final OkHttpClient mOkHttpClient;
private OkHttpUtils() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY);
mHandle = new Handler(Looper.myLooper());
mOkHttpClient = new OkHttpClient.Builder()
.readTimeout(3000, TimeUnit.SECONDS)
.connectTimeout(3000, TimeUnit.SECONDS)
.build();
}
private static OkHttpUtils mOkHttpUtils;
public static OkHttpUtils getInstance() {
if (mOkHttpUtils == null) {
mOkHttpUtils = new OkHttpUtils();
}
return mOkHttpUtils;
}
//判断网络方法
public boolean isNet(Context context) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = manager.getActiveNetworkInfo();
if (activeNetworkInfo != null) {
return activeNetworkInfo.isAvailable();
}
return false;
}
//接口回调
public interface OkHttpCallBack {
void onResponse(String json);
}
//get方法
public void doGet(String url, OkHttpCallBack callBack) {
Request request = new Request.Builder()
.get()
.url(url)
.build();
Call call = mOkHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
String string = response.body().string();
if (callBack != null) {
mHandle.post(new Runnable() {
@Override
public void run() {
callBack.onResponse(string);
}
});
}
}
});
}
flitemlayout的布局在res下的drawable中写
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="20dp" />
<size
android:width="20dp"
android:height="40dp" />
<solid android:color="@color/colortextColor" />
</shape>
这是mvp中负责展示的view层,(我们从这里开始展示数据)
首先是MainActivity,因为我们不使用这个view来进行数据展示,所以简单些只要一些viewpager和tablayout就行
public class MainActivity extends BaseActivity {
private ViewPager pager;
private TabLayout tab;
private ArrayList<String> strings;
private ArrayList<Fragment> fragments;
private HomeFragment homeFragment;
private OtherFragment otherFragment;
//本页面只提供activity加fragment的效果
@Override
protected void initData() {
}
@Override
protected void initView() {
//查询资源id
pager = (ViewPager) findViewById(R.id.viewpager);
tab = (TabLayout) findViewById(R.id.tablayout);
strings = new ArrayList<>();
fragments = new ArrayList<>();
homeFragment = new HomeFragment();
otherFragment = new OtherFragment();
strings.add("首页");
strings.add("我的");
fragments.add(homeFragment);
fragments.add(otherFragment);
pager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
@NonNull
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return strings.get(position);
}
});
tab.setupWithViewPager(pager);
}
@Override
protected int layoutID() {
return R.layout.activity_main;
}
}
我们在这里来进行数据的展示,简单点都好
public class MainActivity extends BaseActivity<MainPresenter> implements IMainContract.IMainView {
@BindView(R.id.main_recycle)
RecyclerView mainRecycle;
private Unbinder unbinder;
//数据
@Override
public void setData(String json) {
Toast.makeText(this, json + "", Toast.LENGTH_SHORT).show();
List<MainBean.ResultBean> result = new Gson().fromJson(json, MainBean.class).getResult();
MyRecycleView myRecycleView = new MyRecycleView(result, MainActivity.this);
mainRecycle.setAdapter(myRecycleView);
mainRecycle.setLayoutManager(new LinearLayoutManager(this, RecyclerView.VERTICAL, false));
myRecycleView.setMyOnClickLisenter(new MyRecycleView.onItemClickLisenter() {
@Override
public void onitemClickView(View view, String s) {
EventBus.getDefault().postSticky("" + s);
Intent intent = new Intent(MainActivity.this, LoginActivity.class);
startActivity(intent);
}
});
}
@Override
protected void initData() {
presenter.getHomeData();
}
@Override
protected MainPresenter initPresenter() {
return new MainPresenter();
}
@Override
protected void initView() {
unbinder = ButterKnife.bind(this);
}
@Override
protected int layoutID() {
return R.layout.activity_main;
}
//解绑
@Override
protected void onDestroy() {
super.onDestroy();
unbinder.unbind();
}
因为是使用的recycleView所以还有adapter
public class MyRecycleView extends RecyclerView.Adapter<MyRecycleView.ViewHolder> {
List<MainBean.ResultBean> result;
Context context;
public MyRecycleView(List<MainBean.ResultBean> result, Context context) {
this.context = context;
this.result = result;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = View.inflate(context, R.layout.item_recycle, null);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
//处理
String commodityName = result.get(position).getCommodityName();
String masterPic = result.get(position).getMasterPic();
int price = result.get(position).getPrice();
//控件
holder.item_name.setText(commodityName);
holder.item_price.setText(price + "");
//fresco
Uri parse = Uri.parse(masterPic);
holder.item_fresco.setImageURI(parse);
}
@Override
public int getItemCount() {
return result.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.item_fresco)
SimpleDraweeView item_fresco;
@BindView(R.id.item_name)
TextView item_name;
@BindView(R.id.item_price)
TextView item_price;
public ViewHolder(@NonNull View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myOnClickLisenter.onitemClickView(v, result.get(getLayoutPosition()).getCommodityName());
}
});
}
}
//创建接口
public interface onItemClickLisenter {
void onitemClickView(View view, String s);
}
private onItemClickLisenter myOnClickLisenter;
public void setMyOnClickLisenter(onItemClickLisenter myOnClickLisenter) {
this.myOnClickLisenter = myOnClickLisenter;
}
}
对了权限记得加一个联网权限
还有记得要在AndroidManifest.xml中将app注释否则呵呵