练手之作切勿见笑

电商项目

首先说一下需要导入的依赖

注意 : 我这里使用的是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注释否则呵呵
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值