这是我文章讲解的项目地址点击这里移步到我的项目地址
上文中仅仅是简单的mvp使用,这里增加了网络请求,还是用最典型的列表实现的,目录结构一样,但是这里还是没有用fragment,activity还是充当v,先看一下目录结构
我习惯吧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里面,有的都可以,但是最主要的是放在那里更合适,更有利于项目的维护和逻辑的编写