基于谷歌todoapp的android mvp(二)

这是我文章讲解的项目地址点击这里移步到我的项目地址
上文中仅仅是简单的mvp使用,这里增加了网络请求,还是用最典型的列表实现的,目录结构一样,但是这里还是没有用fragment,activity还是充当v,先看一下目录结构
列表结构mvp
我习惯吧bean和adapter拿出来,不习惯写内部类,因为有肯能会处理一些事务
先上一下代码,这里最先上的应该是contract,还有就是看接口基本上能一目了然,对结构会有大体的认识
putaocontract

package com.fanyafeng.todomvp.putao;

import android.content.Intent;

import com.fanyafeng.todomvp.BasePresenter;
import com.fanyafeng.todomvp.BaseView;

import java.util.List;

/**
 * Author: fanyafeng
 * Data: 16/12/5 17:59
 * Email: fanyafeng@live.cn
 */
public interface PutaoContract {
    interface View {
        Intent initIntent();

        void start(List<PutaoBean> putaoBeanList);

        void refreshSuccess();

        void refreshFailed();

        void loadMoreSuccess();

        void loadMoreFailed();

        void stopRefresh();

        void stopLoadMore();
    }

    interface Presenter extends BasePresenter {
        void refreshView(String url);

        void loadMore(String url);
    }
}

按照正常的逻辑来讲应该是拿到需求先来定义contract
再来就是activity

package com.fanyafeng.todomvp.putao;

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.andview.refreshview.XRefreshView;
import com.andview.refreshview.XRefreshViewFooter;
import com.fanyafeng.todomvp.R;
import com.fanyafeng.todomvp.BaseActivity;
import com.fanyafeng.todomvp.network.Urls;

import java.net.URL;
import java.util.List;

//需要搭配baseactivity,这里默认为baseactivity,并且默认Baseactivity为包名的根目录
public class PutaoActivity extends BaseActivity implements PutaoContract.View {
    private PutaoPresenter putaoPresenter;
    private XRefreshView refreshPutao;
    private RecyclerView rvPutao;
    private PutaoAdapter putaoAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_putao);
//这里默认使用的是toolbar的左上角标题,如果需要使用的标题为中心的采用下方注释的代码,将此注释掉即可
        title = getString(R.string.title_activity_putao);

        putaoPresenter = new PutaoPresenter(this, this);
        initView();
        putaoPresenter.start();
        initData();
    }


    //初始化UI空间
    private void initView() {
        refreshPutao = (XRefreshView) findViewById(R.id.refreshPutao);
        refreshPutao.setPullLoadEnable(true);
        refreshPutao.setAutoLoadMore(true);
        rvPutao = (RecyclerView) findViewById(R.id.rvPutao);
        rvPutao.setLayoutManager(new GridLayoutManager(this, 2, GridLayoutManager.VERTICAL, false));
    }


    //初始化数据
    private void initData() {
        refreshPutao.setXRefreshViewListener(new XRefreshView.SimpleXRefreshListener() {
            @Override
            public void onRefresh() {
                super.onRefresh();
                putaoPresenter.refreshView(Urls.PUTAO_MAIN_URL);
            }

            @Override
            public void onLoadMore(boolean isSilence) {
                super.onLoadMore(isSilence);
                putaoPresenter.loadMore(Urls.GOOD_LIST_URL);
            }
        });
        putaoPresenter.refreshView(Urls.PUTAO_MAIN_URL);
    }

    @Override
    public void start(List<PutaoBean> putaoBeanList) {
        putaoAdapter = new PutaoAdapter(this, putaoBeanList);
        putaoAdapter.setCustomLoadMoreView(new XRefreshViewFooter(this));
        rvPutao.setAdapter(putaoAdapter);
    }

    @Override
    public Intent initIntent() {
        return getIntent();
    }

    @Override
    public void refreshSuccess() {
        putaoAdapter.notifyDataSetChanged();
    }

    @Override
    public void refreshFailed() {
        Toast.makeText(this, "刷新失败", Toast.LENGTH_SHORT).show();
    }


    @Override
    public void loadMoreSuccess() {
        putaoAdapter.notifyDataSetChanged();
    }

    @Override
    public void loadMoreFailed() {
        Toast.makeText(this, "加载失败", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void stopRefresh() {
        refreshPutao.stopRefresh();
    }

    @Override
    public void stopLoadMore() {
        refreshPutao.stopLoadMore();
    }


}

既然是充当v,那么这里面的一系列动作便是对view的操作
接下来看p

package com.fanyafeng.todomvp.putao;

import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Handler;
import android.util.Log;

import com.fanyafeng.todomvp.network.NetUtil;
import com.fanyafeng.todomvp.network.StringUtil;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

/**
 * Author: fanyafeng
 * Data: 16/12/5 18:10
 * Email: fanyafeng@live.cn
 */
public class PutaoPresenter implements PutaoContract.Presenter {
    private Context context;
    private PutaoContract.View putaoView;

    private Intent intent;

    private List<PutaoBean> putaoBeanList = new ArrayList<>();

    private int page = 1;

    public PutaoPresenter(Context context, PutaoContract.View putaoView) {
        this.context = context;
        this.putaoView = putaoView;
    }

    @Override
    public void start() {
        intent = putaoView.initIntent();
        Log.d("name", intent.getStringExtra("name"));
        putaoView.start(putaoBeanList);

    }

    @Override
    public void refreshView(final String url) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                refreshPutaoView(url);
            }
        }, 1000);
    }

    private void refreshPutaoView(final String url) {
        page = 1;
        new AsyncTask<String, String, String>() {

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }

            @Override
            protected void onPostExecute(String response) {
                super.onPostExecute(response);

                try {
                    if (!StringUtil.isNullOrEmpty(response)) {
                        putaoBeanList.clear();
                        JSONObject jsonObject = new JSONObject(response);
                        String state = jsonObject.optString("state");
                        if (!StringUtil.isNullOrEmpty(state) && state.equals(NetUtil.STATE_OK)) {

                            JSONObject jsonData = jsonObject.optJSONObject("data");
                            if (jsonData != null) {
                                JSONArray products = jsonData.optJSONArray("products");
                                for (int i = 0; i < products.length(); i++) {
                                    PutaoBean putaoBean = new PutaoBean(products.optJSONObject(i));
                                    putaoBeanList.add(putaoBean);
                                }
                                putaoView.stopRefresh();
                                putaoView.refreshSuccess();

                                return;
                            }
                        }
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                putaoView.stopRefresh();
                putaoView.refreshFailed();
            }


            @Override
            protected String doInBackground(String... params) {
                return NetUtil.httpGetUtil(context, url);
            }
        }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    }

    @Override
    public void loadMore(final String url) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                loadMorePutaoView(url);
            }
        }, 1000);
    }

    private void loadMorePutaoView(final String url) {
        new AsyncTask<String, String, String>() {
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }

            @Override
            protected void onPostExecute(String response) {
                super.onPostExecute(response);

                try {
                    if (!StringUtil.isNullOrEmpty(response)) {
                        JSONObject jsonObject = new JSONObject(response);

                        if (jsonObject.getString("state").equals(NetUtil.STATE_OK)) {
                            JSONObject data = jsonObject.optJSONObject("data");
                            JSONArray list = data.optJSONArray("list");
                            for (int i = 0; i < list.length(); i++) {
                                PutaoBean putaoBean = new PutaoBean(list.optJSONObject(i));
                                putaoBeanList.add(putaoBean);
                            }
                            putaoView.stopLoadMore();
                            putaoView.loadMoreSuccess();

                            return;
                        }
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                putaoView.stopLoadMore();
                putaoView.loadMoreFailed();
            }

            @Override
            protected String doInBackground(String... params) {
                return NetUtil.httpGetUtil(context, url + page);
            }
        }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        page++;
    }
}

p应该是对逻辑,数据的一系列操作以及维护
还有就是常用不可或缺的bean,adapter

package com.fanyafeng.todomvp.putao;

import android.os.Parcel;
import android.os.Parcelable;

import org.json.JSONObject;

/**
 * Author: fanyafeng
 * Data: 16/12/6 10:32
 * Email: fanyafeng@live.cn
 */
public class PutaoBean implements Parcelable{
    private String detailUrl;
    private String img;
    private int quantity;
    private int salePrice;
    private String cnName;
    private String enName;
    private int id;

    public PutaoBean(JSONObject jsonObject) {
        setDetailUrl(jsonObject.optString("detail_url"));
        setImg(jsonObject.optString("img"));
        setQuantity(jsonObject.optInt("quantity"));
        setSalePrice(jsonObject.optInt("sale_price"));
        setCnName(jsonObject.optString("cn_name"));
        setEnName(jsonObject.optString("en_name"));
        setId(jsonObject.optInt("id"));
    }


    protected PutaoBean(Parcel in) {
        detailUrl = in.readString();
        img = in.readString();
        quantity = in.readInt();
        salePrice = in.readInt();
        cnName = in.readString();
        enName = in.readString();
        id = in.readInt();
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(detailUrl);
        dest.writeString(img);
        dest.writeInt(quantity);
        dest.writeInt(salePrice);
        dest.writeString(cnName);
        dest.writeString(enName);
        dest.writeInt(id);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    public static final Creator<PutaoBean> CREATOR = new Creator<PutaoBean>() {
        @Override
        public PutaoBean createFromParcel(Parcel in) {
            return new PutaoBean(in);
        }

        @Override
        public PutaoBean[] newArray(int size) {
            return new PutaoBean[size];
        }
    };

    public String getDetailUrl() {
        return detailUrl;
    }

    public void setDetailUrl(String detailUrl) {
        this.detailUrl = detailUrl;
    }

    public String getImg() {
        return img;
    }

    public void setImg(String img) {
        this.img = img;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public int getSalePrice() {
        return salePrice;
    }

    public void setSalePrice(int salePrice) {
        this.salePrice = salePrice;
    }

    public String getCnName() {
        return cnName;
    }

    public void setCnName(String cnName) {
        this.cnName = cnName;
    }

    public String getEnName() {
        return enName;
    }

    public void setEnName(String enName) {
        this.enName = enName;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "PutaoBean{" +
                "detailUrl='" + detailUrl + '\'' +
                ", img='" + img + '\'' +
                ", quantity=" + quantity +
                ", salePrice=" + salePrice +
                ", cnName='" + cnName + '\'' +
                ", enName='" + enName + '\'' +
                ", id=" + id +
                '}';
    }
}
package com.fanyafeng.todomvp.putao;

import android.content.Context;
import android.net.Uri;
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.RelativeLayout;
import android.widget.TextView;

import com.andview.refreshview.recyclerview.BaseRecyclerAdapter;
import com.facebook.drawee.view.SimpleDraweeView;
import com.fanyafeng.todomvp.R;

import java.util.List;

/**
 * Author: fanyafeng
 * Data: 16/12/6 10:31
 * Email: fanyafeng@live.cn
 */
public class PutaoAdapter extends BaseRecyclerAdapter<PutaoAdapter.ShowWineViewHolder> {
    private Context context;
    private List<PutaoBean> productWineBeanList;

    public PutaoAdapter(Context context, List<PutaoBean> productWineBeanList) {
        this.context = context;
        this.productWineBeanList = productWineBeanList;
    }


    @Override
    public ShowWineViewHolder getViewHolder(View view) {
        return new ShowWineViewHolder(view);
    }

    @Override
    public ShowWineViewHolder onCreateViewHolder(ViewGroup parent, int viewType, boolean isItem) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_show_wine, parent, false);
        return (new ShowWineViewHolder(view));
    }

    @Override
    public void onBindViewHolder(ShowWineViewHolder holder, int position, boolean isItem) {
        final PutaoBean productWineBean = productWineBeanList.get(position);
        holder.sdv_show_wine_view.setImageURI(Uri.parse(productWineBean.getImg()));
        holder.sdv_show_wine_view.setAdjustViewBounds(true);
        holder.sdv_show_wine_view.setAspectRatio(1.0f);
        holder.tv_show_wine_cnname.setText(productWineBean.getCnName());
        holder.tv_show_wine_enname.setText(productWineBean.getEnName());
        holder.tv_show_wine_price.setText("人民币" + productWineBean.getSalePrice());
    }


    @Override
    public int getAdapterItemCount() {
        return productWineBeanList.size();
    }

    class ShowWineViewHolder extends RecyclerView.ViewHolder {
        RelativeLayout layoutShowWine;
        SimpleDraweeView sdv_show_wine_view;
        ImageView wineState;
        ImageView wineCollect;
        TextView tv_show_wine_cnname;
        TextView tv_show_wine_enname;
        TextView tv_show_wine_price;
        TextView tv_show_wine_realprice;
        TextView tv_show_number_state;

        public ShowWineViewHolder(View itemView) {
            super(itemView);
            layoutShowWine = (RelativeLayout) itemView.findViewById(R.id.layoutShowWine);
            sdv_show_wine_view = (SimpleDraweeView) itemView.findViewById(R.id.sdv_show_wine_view);
            tv_show_wine_cnname = (TextView) itemView.findViewById(R.id.tv_show_wine_cnname);
            tv_show_wine_enname = (TextView) itemView.findViewById(R.id.tv_show_wine_enname);
            tv_show_wine_price = (TextView) itemView.findViewById(R.id.tv_show_wine_price);
            tv_show_wine_realprice = (TextView) itemView.findViewById(R.id.tv_show_wine_realprice);
            tv_show_number_state = (TextView) itemView.findViewById(R.id.tv_show_number_state);
            wineState = (ImageView) itemView.findViewById(R.id.wineState);
            wineCollect = (ImageView) itemView.findViewById(R.id.wineCollect);
        }
    }
}

那这里简单说一下v是用activity充当的,p就是p,那这里需要注意了,那些放在v里面那些放在p里面,有的都可以,但是最主要的是放在那里更合适,更有利于项目的维护和逻辑的编写

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值