下面是购物车MVP效果的简单实现
首先是布局
这是Activity_main布局
这个是Activity_goods布局
这是Activity_car布局
这是rv_item_car布局
这是rv_item_goods布局
接下来就是各个类的代码
MainActivity类
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Button;
import com.example.shoppingcard.adapter.GoodsRVAdaptet;
import com.example.shoppingcard.bean.Goods;
import com.example.shoppingcard.presenter.GoodsPresenter;
import com.example.shoppingcard.view.IHomeView;
import java.util.List;
public class MainActivity extends AppCompatActivity implements IHomeView<Goods>{
RecyclerView rv;
GoodsRVAdaptet adapter;
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
GoodsPresenter presenter = new GoodsPresenter(this, this);
presenter.showGoodsRV();
}
private void initView() {
rv = (RecyclerView) findViewById(R.id.rv);
btn = (Button) findViewById(R.id.btn_cart);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(MainActivity.this, CartActivity.class);
startActivity(i);
}
});
}
@Override
public void setRVData(final List<Goods> list) {
RecyclerView.LayoutManager manager = new LinearLayoutManager(this);
rv.setLayoutManager(manager);
adapter = new GoodsRVAdaptet(this, list);
rv.setAdapter(adapter);
adapter.setOnRVItemClickListener(new GoodsRVAdaptet.OnRVItemClickListener() {
@Override
public void onRVItemClick(View view, int position) {
Intent i = new Intent(MainActivity.this, GoodsActivity.class);
i.putExtra("goods", list.get(position));
startActivity(i);
}
});
}
@Override
public void refreshRV(List<Goods> list) {
adapter.setData(list);
}
}
GoodsActivity类
import android.content.ContentValues;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.example.shoppingcard.bean.CartGoods;
import com.example.shoppingcard.bean.Goods;
import com.example.shoppingcard.dao.GoodsDao;
import com.example.shoppingcard.utils.ConstantUtils;
public class GoodsActivity extends AppCompatActivity {
TextView tv_goods,tv_price;
Button btn_add;
boolean isAdd = true;
GoodsDao dao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_goods);
dao = GoodsDao.getInstance(this);
Intent intent = getIntent();
Goods goods = (Goods) intent.getSerializableExtra("goods");
initView();
setData(goods);
}
private void setData(final Goods goods) {
tv_goods.setText(goods.getGname());
tv_price.setText(goods.getPrice() + "");
btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
isAdd = true;
if(ConstantUtils.list.size() > 0){
for (int i = 0; i < ConstantUtils.list.size(); i++) {
if(goods.getGid().equals(ConstantUtils.list.get(i).getGoods().getGid())){
isAdd = false;
int count = ConstantUtils.list.get(i).getCount();
ConstantUtils.list.get(i).setCount(count + 1);
ContentValues cv = new ContentValues();
cv.put("count" , count + 1);
dao.updata(cv, goods.getGid());
break;
}
}
}
if(isAdd){
CartGoods cg = new CartGoods();
cg.setGoods(goods);
cg.setCount(1);
ConstantUtils.list.add(cg);
ContentValues cv = new ContentValues();
cv.put("gid", goods.getGid());
cv.put("sid", goods.getSid());
cv.put("uid", goods.getUid());
cv.put("price", goods.getPrice());
cv.put("gname", goods.getGname());
cv.put("count", cg.getCount());
dao.insert(cv);
}
}
});
}
private void initView() {
tv_goods = (TextView) findViewById(R.id.tv_goods_name);
tv_price = (TextView) findViewById(R.id.tv_goods_price);
btn_add = (Button) findViewById(R.id.btn_add_cart);
}
}
CarActivity类
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import com.example.shoppingcard.adapter.CartRVAdaptet;
import com.example.shoppingcard.dao.GoodsDao;
import com.example.shoppingcard.utils.ConstantUtils;
public class CartActivity extends AppCompatActivity {
RecyclerView rv_cart;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cart);
if(ConstantUtils.list.size() == 0){
ConstantUtils.list = GoodsDao.getInstance(this).queyrAll();
}
initView();
}
private void initView() {
rv_cart = (RecyclerView) findViewById(R.id.rv_cart);
RecyclerView.LayoutManager manager = new LinearLayoutManager(this);
rv_cart.setLayoutManager(manager);
CartRVAdaptet adapter = new CartRVAdaptet(this);
rv_cart.setAdapter(adapter);
}
}
接下来的各个需要的包
依次是:
adapter包内
GoodsRVAdapter类
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.shoppingcard.R;
import com.example.shoppingcard.bean.Goods;
import java.util.List;
/**
* Created by yfeng on 2017/10/21.
*/
public class GoodsRVAdaptet extends RecyclerView.Adapter<GoodsRVAdaptet.GoodsHolder>{
Context context;
List<Goods> list;
public GoodsRVAdaptet(Context context, List<Goods> list) {
this.context = context;
this.list = list;
}
public void setData(List<Goods> list){
this.list = list;
notifyDataSetChanged();
}
@Override
public GoodsHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = View.inflate(context,R.layout.rv_item_goods,null);
GoodsHolder holder = new GoodsHolder(v);
return holder;
}
@Override
public void onBindViewHolder(GoodsHolder holder, final int position) {
holder.tv_name.setText(list.get(position).getGname());
holder.tv_price.setText(list.get(position).getPrice() + "元");
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onRVItemClick(view, position);
}
});
}
@Override
public int getItemCount() {
return list == null ? 0 : list.size();
}
class GoodsHolder extends RecyclerView.ViewHolder{
TextView tv_name;
TextView tv_price;
public GoodsHolder(View itemView) {
super(itemView);
tv_name = itemView.findViewById(R.id.tv_goods_name);
tv_price = itemView.findViewById(R.id.tv_goods_price);
}
}
private OnRVItemClickListener listener;
public void setOnRVItemClickListener(OnRVItemClickListener listener){
this.listener = listener;
}
public interface OnRVItemClickListener{
public void onRVItemClick(View view, int position);
}
}
CarRVAdapter类
import android.content.ContentValues;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import com.example.shoppingcard.R;
import com.example.shoppingcard.bean.CartGoods;
import com.example.shoppingcard.dao.GoodsDao;
import com.example.shoppingcard.utils.ConstantUtils;
import java.util.List;
/**
* Created by yfeng on 2017/10/21.
*/
public class CartRVAdaptet extends RecyclerView.Adapter<CartRVAdaptet.CartHolder>{
Context context;
public CartRVAdaptet(Context context) {
this.context = context;
}
public void setData(List<CartGoods> list){
notifyDataSetChanged();
}
@Override
public CartHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = View.inflate(context,R.layout.rv_item_cart,null);
CartHolder holder = new CartHolder(v);
return holder;
}
@Override
public void onBindViewHolder(CartHolder holder, final int position) {
holder.tv_name.setText(ConstantUtils.list.get(position).getGoods().getGname());
holder.tv_price.setText(ConstantUtils.list.get(position).getGoods().getPrice() + "元");
holder.tv_count.setText(ConstantUtils.list.get(position).getCount() + "");
holder.btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int count = ConstantUtils.list.get(position).getCount() + 1;
ContentValues cv = new ContentValues();
cv.put("count", count);
GoodsDao.getInstance(context).updata(cv, ConstantUtils.list.get(position).getGoods().getGid());
notifyItemChanged(position);
}
});
holder.btn_sub.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int count = ConstantUtils.list.get(position).getCount();
if(count > 0){
ContentValues cv = new ContentValues();
cv.put("count", count - 1);
GoodsDao.getInstance(context).updata(cv, ConstantUtils.list.get(position).getGoods().getGid());
notifyItemChanged(position);
}
}
});
}
@Override
public int getItemCount() {
return ConstantUtils.list == null ? 0 : ConstantUtils.list.size();
}
class CartHolder extends RecyclerView.ViewHolder{
TextView tv_name;
TextView tv_price;
TextView tv_count;
Button btn_add, btn_sub;
public CartHolder(View itemView) {
super(itemView);
tv_name = itemView.findViewById(R.id.tv_goods_name);
tv_price = itemView.findViewById(R.id.tv_goods_price);
tv_count = itemView.findViewById(R.id.tv_count);
btn_add = itemView.findViewById(R.id.btn_add);
btn_sub = itemView.findViewById(R.id.btn_sub);
}
}
}
view包
IHomeVIew类
public interface IHomeView<T> {
public void setRVData(List<T> list);
public void refreshRV(List<T> list);
}
Utils包
ConstantUtils类
public class ConstantUtils {
public static List<CartGoods> list = new ArrayList<>();
}
presenter包
GoodsPresenter类
import com.example.shoppingcard.bean.Goods;
import com.example.shoppingcard.model.GoodsModel;
import com.example.shoppingcard.model.IGoodsModel;
import com.example.shoppingcard.view.IHomeView;
import java.util.List;
/**
* Created by yfeng on 2017/10/21.
*/
public class GoodsPresenter {
IGoodsModel model;
IHomeView view;
Context context;
public GoodsPresenter(IHomeView view, Context context) {
this.view = view;
this.context = context;
this.model = new GoodsModel();
}
public void showGoodsRV(){
List<Goods> list = model.getData();
view.setRVData(list);
}
}
okhttp包
OkHttpUtils类
public class OkHttpUtils {
private Handler handler = new Handler();
public synchronized Handler getHandler(){
return handler;
}
private static OkHttpUtils okHttpUtils = new OkHttpUtils();
private OkHttpUtils(){}
public synchronized static OkHttpUtils getInstance(){
return okHttpUtils;
}
private OkHttpClient client = null;
private synchronized void initOkClientInstance(){
client = new OkHttpClient.Builder().build();
}
public void doGet(String url, Callback callback){
initOkClientInstance();
Request request = new Request.Builder().url(url).build();
Call call = client.newCall(request);
call.enqueue(callback);
}
}
OnUICallBack类
public abstract class OnUICallBack implements Callback{
private Handler handler = OkHttpUtils.getInstance().getHandler();
public abstract void onFailed(Call call, IOException e);
public abstract void onSuccess(Call call, Response response) throws IOException ;
@Override
public void onFailure(final Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
onFailed(call, e);
}
});
}
@Override
public void onResponse(final Call call, final Response response) throws IOException {
handler.post(new Runnable() {
@Override
public void run() {
try {
Log.i("==========", "run: " + Thread.currentThread() + Thread.currentThread().getName() + Thread.currentThread().getId());
onSuccess(call, response);
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
Model包
GoodsModel类
public class GoodsModel implements IGoodsModel {
@Override
public List<Goods> getData() {
// OkHttpUtils.getInstance().doGet("");
List<Goods> list = new ArrayList<>();
Random r = new Random();
for (int i = 0; i < 100; i++) {
Goods g = new Goods();
g.setGname("商品" + i);
g.setPrice(i + (double)r.nextInt(10)/100);
g.setSid("s" + i);
g.setUid("yy");
g.setGid("g" + i);
list.add(g);
}
return list;
}
}
IGoodsModel类
public interface IGoodsModel<T> {
public List<T> getData();
}
db包
MySQLiteOpenHelper类
public class MySQLiteOpenHelper extends SQLiteOpenHelper{
public MySQLiteOpenHelper(Context context) {
super(context, "taobao.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
String sql = "create table goods(id integer auto increment primary key , sid varchar, gid varchar, uid varchar, gname varchar, count integer, price double)";
sqLiteDatabase.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
dao包
GoodsDao类
public class GoodsDao {
private static MySQLiteOpenHelper helper;
private static final String TABLE_NAME = "goods";
private static GoodsDao dao = new GoodsDao();
private GoodsDao(){
};
public static GoodsDao getInstance(Context context){
if(helper == null){
helper = new MySQLiteOpenHelper(context);
}
return dao;
}
public void insert(ContentValues cv){
SQLiteDatabase db = helper.getWritableDatabase();
db.insert(TABLE_NAME, null, cv);
db.close();
ConstantUtils.list = queyrAll();
}
public void updata(ContentValues cv, String gid){
SQLiteDatabase db = helper.getWritableDatabase();
db.update(TABLE_NAME, cv, "gid = ?", new String[]{gid});
db.close();
ConstantUtils.list = queyrAll();
}
public List<CartGoods> queyrAll(){
List<CartGoods> goodsList = new ArrayList<>();
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME,null,null,null,null,null,null);
while(cursor.moveToNext()){
Goods g = new Goods();
g.setGname(cursor.getString(cursor.getColumnIndex("gname")));
g.setGid(cursor.getString(cursor.getColumnIndex("gid")));
g.setSid(cursor.getString(cursor.getColumnIndex("sid")));
g.setUid(cursor.getString(cursor.getColumnIndex("uid")));
g.setPrice(cursor.getDouble(cursor.getColumnIndex("price")));
CartGoods cg = new CartGoods();
cg.setCount(cursor.getInt(cursor.getColumnIndex("count")));
cg.setGoods(g);
goodsList.add(cg);
}
db.close();
return goodsList;
}
}
bean包
Goods类
public class Goods implements Serializable {
private String gname;
private String gid;//商品id
private String sid;//商家id
private String uid;//用户id
private double price;
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
public String getGid() {
return gid;
}
public void setGid(String gid) {
this.gid = gid;
}
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
@Override
public String toString() {
return "Goods{" +
"gname='" + gname + '\'' +
", gid='" + gid + '\'' +
", sid='" + sid + '\'' +
", uid='" + uid + '\'' +
", price=" + price +
'}';
}
}
CartGoods类
public class CartGoods {
Goods goods;
private int count;
private boolean flag;//true:网络购物车中取回的商品, false:没登录时添加过的商品
public Goods getGoods() {
return goods;
}
public void setGoods(Goods goods) {
this.goods = goods;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
@Override
public String toString() {
return "CardGoods{" +
"goods=" + goods +
", count=" + count +
", flag=" + flag +
'}';
}
}
以上就是这次购物车简单实现的代码,和大家分享一下,同时也希望各位大牛提供一些意见