展示商品信息以及加入购物车,点击商品条目可跳转到购物车查看购物车中的商品
如图展示商品的Activity,点击搜索可以搜索商品,点击加入购物车可以把商品添加到购物车,点击条目可以跳转到购物车的Activity
(对应的布局如上图所示头部布局,加XRecyclerView控件内容展示,可以实现上拉加载,下拉刷新)
package com.example.renzhili20181220.activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.OrientationHelper;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;
import com.example.renzhili20181220.Apis;
import com.example.renzhili20181220.R;
import com.example.renzhili20181220.adapter.MyShopAdapter;
import com.example.renzhili20181220.bean.AddBean;
import com.example.renzhili20181220.bean.ShopBean;
import com.example.renzhili20181220.presenter.IPresenterImpl;
import com.example.renzhili20181220.view.IView;
import com.jcodecraeer.xrecyclerview.XRecyclerView;
import java.util.HashMap;
import java.util.Map;
public class ShowActivity extends AppCompatActivity implements View.OnClickListener,IView {
private IPresenterImpl iPresenter;
private XRecyclerView xRecyclerView;
private EditText edit_text;
private ImageButton image_list;
private MyShopAdapter myShopAdapter;
private int mpage;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.show_item);
iPresenter=new IPresenterImpl(this);
initView();
init();
}
private void init() {
Intent intent = getIntent();
String name = intent.getStringExtra("name");
Map<String,String> params =new HashMap<>();
params.put("keywords",name);
params.put("page",String.valueOf(mpage));
iPresenter.getRequeryData(Apis.URL_DATA,params,ShopBean.class);
}
private void initView() {
mpage=1;
//获取资源id
xRecyclerView=findViewById(R.id.xrecyclervier);
edit_text=findViewById(R.id.edit_text);
image_list=findViewById(R.id.image_list);
//点击事件
image_list.setOnClickListener(this);
//线性布局
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
xRecyclerView.setLayoutManager(linearLayoutManager);
xRecyclerView.addItemDecoration(new DividerItemDecoration(this,OrientationHelper.VERTICAL));
//创建适配器
myShopAdapter = new MyShopAdapter(this);
xRecyclerView.setAdapter(myShopAdapter);
xRecyclerView.setPullRefreshEnabled(true);
xRecyclerView.setLoadingMoreEnabled(true);
xRecyclerView.setLoadingListener(new XRecyclerView.LoadingListener() {
@Override
public void onRefresh() {
mpage=1;
initData();
}
@Override
public void onLoadMore() {
initData();
}
});
//加入购物车
myShopAdapter.setOnClick(new MyShopAdapter.Click() {
@Override
public void onClick(int pid) {
Map<String,String> params =new HashMap<>();
params.put("uid",String.valueOf(23011));
params.put("pid",String.valueOf(pid));
iPresenter.getRequeryData(Apis.URL_ADD,params,AddBean.class);
}
});
//点击条目跳转到购物车
myShopAdapter.setOnLongClick(new MyShopAdapter.LongClick() {
@Override
public void onClick(int pisotion) {
Intent intent = new Intent(ShowActivity.this,LoginActivity.class);
startActivity(intent);
}
});
}
//获取数据
private void initData() {
Map<String,String> params =new HashMap<>();
params.put("keywords",edit_text.getText().toString().trim());
params.put("page",String.valueOf(mpage));
iPresenter.getRequeryData(Apis.URL_DATA,params,ShopBean.class);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.image_list:
initView();
initData();
break;
default:
break;
}
}
@Override
public void showRequeryData(Object o) {
if (o instanceof ShopBean){
ShopBean shopBean = (ShopBean) o;
if (shopBean==null||!shopBean.isSuccess()){
Toast.makeText(ShowActivity.this,shopBean.getMsg(),Toast.LENGTH_SHORT).show();;
}else{
if (mpage==1){
myShopAdapter.setList(shopBean.getData());
}else{
myShopAdapter.addList(shopBean.getData());
}
mpage++;
xRecyclerView.loadMoreComplete();
xRecyclerView.refreshComplete();
}
}else if(o instanceof AddBean){
AddBean addBean = (AddBean) o;
Toast.makeText(ShowActivity.this,addBean.getMsg(),Toast.LENGTH_SHORT).show();
}
}
}
展示商品的activity对应的适配器adapter,对应的布局为上图所示条目布局,可以自行布置
package com.example.renzhili20181220.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.constraint.ConstraintLayout;
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.TextView;
import com.bumptech.glide.Glide;
import com.example.renzhili20181220.R;
import com.example.renzhili20181220.bean.ShopBean;
import java.util.ArrayList;
import java.util.List;
public class MyShopAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private List<ShopBean.DataBean> list;
public MyShopAdapter(Context context) {
this.context = context;
list=new ArrayList<>();
}
public void setList(List<ShopBean.DataBean> data) {
list.clear();
if (data!=null){
list.addAll(data);
}
notifyDataSetChanged();
}
public void addList(List<ShopBean.DataBean> data) {
if (data!=null){
list.addAll(data);
}
notifyDataSetChanged();
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view=LayoutInflater.from(context).inflate(R.layout.shop_item,viewGroup,false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, final int i) {
MyViewHolder myViewHolder = (MyViewHolder) viewHolder;
myViewHolder.title.setText(list.get(i).getTitle());
myViewHolder.price.setText("价格:"+list.get(i).getPrice());
String[] split = list.get(i).getImages().split("\\|");
Glide.with(context).load(split[0].replace("https","http")).into(myViewHolder.images);
//点击加入购物车
myViewHolder.add_shop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (click!=null){
click.onClick(list.get(i).getPid());
}
}
});
//点击跳转到购物车
myViewHolder.constraintLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (longClick!=null){
longClick.onClick(i);
}
}
});
}
@Override
public int getItemCount() {
return list.size();
}
class MyViewHolder extends RecyclerView.ViewHolder{
ImageView images;
TextView title,price,add_shop;
ConstraintLayout constraintLayout;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
images=itemView.findViewById(R.id.images);
title=itemView.findViewById(R.id.title);
price=itemView.findViewById(R.id.price);
add_shop=itemView.findViewById(R.id.add_shop);
constraintLayout=itemView.findViewById(R.id.constraintlayout);
}
}
//声明加入购物车的接口
Click click;
public void setOnClick(Click click){
this.click=click;
}
//接口
public interface Click{
void onClick(int pid);
}
//声明接口,跳转
LongClick longClick;
public void setOnLongClick(LongClick longClick){
this.longClick=longClick;
}
//接口
public interface LongClick{
void onClick(int pisotion);
}
}
购物车对应的activity,展示加入购物车的数据
(对应的布局为上图头部+中间Recyclerview控件+底部布局)
package com.example.renzhili20181220.activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.OrientationHelper;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;
import com.example.renzhili20181220.Apis;
import com.example.renzhili20181220.R;
import com.example.renzhili20181220.adapter.MyChiledAdapter;
import com.example.renzhili20181220.bean.CliedBean;
import com.example.renzhili20181220.presenter.IPresenterImpl;
import com.example.renzhili20181220.view.IView;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class LoginActivity extends AppCompatActivity implements View.OnClickListener,IView {
private IPresenterImpl iPresenter;
private RecyclerView recyclerView;
private MyChiledAdapter myChiledAdapter;
private List<CliedBean.DataBean> data;
private CheckBox select_all;
private TextView text_price;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_item);
iPresenter=new IPresenterImpl(this);
initView();
initData();
}
private void initData() {
Map<String,String> params =new HashMap<>();
params.put("uid",String.valueOf(23011));
iPresenter.getRequeryData(Apis.URL_QUERY,params,CliedBean.class);
}
private void initView() {
recyclerView=findViewById(R.id.recyclerview);
select_all=findViewById(R.id.select_all);
text_price=findViewById(R.id.text_price);
select_all.setOnClickListener(this);
//线性布局
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.addItemDecoration(new DividerItemDecoration(this,OrientationHelper.VERTICAL));
//创建适配器
myChiledAdapter = new MyChiledAdapter(this);
recyclerView.setAdapter(myChiledAdapter);
myChiledAdapter.setListener(new MyChiledAdapter.CallBackListener() {
@Override
public void callBack() {
double totalPrice = 0;
int num = 0;
int totalNum = 0;
for (int i =0;i<data.size();i++){
List<CliedBean.DataBean.ListBean> listall = data.get(i).getList();
for (int j =0;j<listall.size();j++){
totalNum+=listall.get(j).getNum();
if (listall.get(j).isCheck()){
num+=listall.get(j).getNum();
totalPrice+=listall.get(j).getNum()*listall.get(j).getPrice();
}
}
}
if (num<totalNum){
select_all.setChecked(false);
}else{
select_all.setChecked(true);
}
text_price.setText("合计:"+totalPrice);
select_all.setText("已选("+num+")");
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.select_all:
checkSeller(select_all.isChecked());
myChiledAdapter.notifyDataSetChanged();
break;
default:
}
}
/**
* 修改选中状态,获取价格和数量
*/
private void checkSeller(boolean checked) {
double totalPrice = 0;
int num = 0;
for (int i=0;i<data.size();i++){
//遍历商家,改变状态
CliedBean.DataBean dataBean = data.get(i);
dataBean.setCheck(checked);
List<CliedBean.DataBean.ListBean> listbean = data.get(i).getList();
for (int j=0;j<listbean.size();j++){
//遍历商品,改变状态
listbean.get(j).setCheck(checked);
totalPrice+=listbean.get(j).getPrice()*listbean.get(j).getNum();
num+=listbean.get(j).getNum();
}
}
if (checked){
text_price.setText("合计:"+totalPrice);
select_all.setText("已选("+num+")");
}else{
text_price.setText("合计:0.00");
select_all.setText("已选(0)");
}
}
@Override
public void showRequeryData(Object o) {
if (o instanceof CliedBean){
CliedBean cliedBean = (CliedBean) o;
if (cliedBean==null||!cliedBean.isSuccess()){
Toast.makeText(LoginActivity.this,cliedBean.getMsg(),Toast.LENGTH_SHORT).show();;
}else{
data = cliedBean.getData();
data.remove(0);
myChiledAdapter.setList(data);
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
iPresenter.onAtch();
}
}
对应的商家适配器(所对应的布局为上部复选框和商家名称+下边Recyclerview控件展示商品详情)
package com.example.renzhili20181220.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.TextView;
import com.example.renzhili20181220.R;
import com.example.renzhili20181220.bean.CliedBean;
import java.util.ArrayList;
import java.util.List;
public class MyChiledAdapter extends RecyclerView.Adapter<MyChiledAdapter.ViewHolder> {
private List<CliedBean.DataBean> list;
private Context context;
public MyChiledAdapter(Context context) {
this.context = context;
list=new ArrayList<>();
}
public List<CliedBean.DataBean> getList() {
return list;
}
public void setList(List<CliedBean.DataBean> data) {
list.clear();
if (data!=null){
list.addAll(data);
}
notifyDataSetChanged();
}
@NonNull
@Override
public MyChiledAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(context).inflate(R.layout.chiled_item,viewGroup,false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final MyChiledAdapter.ViewHolder viewHolder, final int i) {
viewHolder.sellerName.setText(list.get(i).getSellerName());
final MyZiAdapter myZiAdapter = new MyZiAdapter(context, list.get(i).getList());
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
viewHolder.recyclerView.setLayoutManager(linearLayoutManager);
viewHolder.recyclerView.setAdapter(myZiAdapter);
viewHolder.shop_item.setChecked(list.get(i).isCheck());
//调用商品里的方法
myZiAdapter.setListener(new MyZiAdapter.CallBackListener() {
@Override
public void callBack() {
if (mCallBackListener!=null) {
mCallBackListener.callBack();
}
List<CliedBean.DataBean.ListBean> listbean = MyChiledAdapter.this.list.get(i).getList();
//创建一个临时的标志位,用来记录现在点击的状态
boolean isAllChecked = true;
for (CliedBean.DataBean.ListBean bean:listbean
) {
if (!bean.isCheck()){
isAllChecked=false;
break;
}
}
//刷新商家的状态
viewHolder.shop_item.setChecked(isAllChecked);
list.get(i).setCheck(isAllChecked);
}
});
//监听checkBox的点击事件
//目的是改变旗下所有商品的选中状态
viewHolder.shop_item.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//首先改变自己的标志位
list.get(i).setCheck(viewHolder.shop_item.isChecked());
//调用产品adapter的方法,用来全选和反选
myZiAdapter.selectOrRemoveAll(viewHolder.shop_item.isChecked());
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
CheckBox shop_item;
TextView sellerName;
RecyclerView recyclerView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
shop_item=itemView.findViewById(R.id.shop_item);
sellerName=itemView.findViewById(R.id.sellerName);
recyclerView=itemView.findViewById(R.id.recyclerview);
}
}
CallBackListener mCallBackListener;
public void setListener(CallBackListener mCallBackListener){
this.mCallBackListener=mCallBackListener;
}
public interface CallBackListener{
void callBack();
}
}
对应的商品的适配器(布局为上图所示布局自行布局,其中加加减减为自定义view实现,下面会上场)
package com.example.renzhili20181220.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.example.renzhili20181220.R;
import com.example.renzhili20181220.bean.CliedBean;
import com.example.renzhili20181220.view.AddSubView;
import java.util.List;
public class MyZiAdapter extends RecyclerView.Adapter<MyZiAdapter.ViewHolder> {
private Context context;
private List<CliedBean.DataBean.ListBean> list;
public MyZiAdapter(Context context, List<CliedBean.DataBean.ListBean> list) {
this.context = context;
this.list = list;
}
@NonNull
@Override
public MyZiAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(context).inflate(R.layout.zi_chiled_item,viewGroup,false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyZiAdapter.ViewHolder viewHolder, final int i) {
viewHolder.title.setText(list.get(i).getTitle());
viewHolder.price.setText("价格:"+list.get(i).getPrice());
String img = list.get(i).getImages().split("\\|")[0].replace("https", "http");
Glide.with(context).load(img).into(viewHolder.images);
//根据我记录的状态,改变勾选
viewHolder.check_item.setChecked(list.get(i).isCheck());
//商品的跟商家的有所不同,商品添加了选中改变的监听
viewHolder.check_item.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//优先改变自己的状态
list.get(i).setCheck(isChecked);
//回调,目的是告诉activity,有人选中状态被改变
if (callBackListener!=null){
callBackListener.callBack();
}
}
});
//设置自定义View里的Edit
viewHolder.addSubView.setList(list,i,this);
viewHolder.addSubView.setOnCallBackListener(new AddSubView.CallBackListener() {
@Override
public void callback() {
if (callBackListener!=null){
callBackListener.callBack();
}
}
});
}
@Override
public int getItemCount() {
return list.size();
}
/**
* 在我们子商品的adapter中,修改子商品的全选和反选
*
* @param checked
*/
public void selectOrRemoveAll(boolean checked) {
for (CliedBean.DataBean.ListBean bean:list
) {
bean.setCheck(checked);
}
notifyDataSetChanged();
}
public class ViewHolder extends RecyclerView.ViewHolder {
CheckBox check_item;
TextView title,price;
ImageView images;
AddSubView addSubView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
check_item=itemView.findViewById(R.id.check_item);
title=itemView.findViewById(R.id.title);
images=itemView.findViewById(R.id.image);
price=itemView.findViewById(R.id.price);
addSubView=itemView.findViewById(R.id.addsubview);
}
}
CallBackListener callBackListener;
public void setListener(CallBackListener callBackListener){
this.callBackListener=callBackListener;
}
public interface CallBackListener{
void callBack();
}
}
自定义view实现加加减减效果
下面为布局文件xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ImageButton
android:id="@+id/image_sub"
android:layout_width="30dp"
android:layout_height="30dp"
android:background="@drawable/ic_action_sub"
/>
<EditText
android:id="@+id/edit_text"
android:layout_width="30dp"
android:layout_height="30dp"
android:text="1"
android:inputType="number"
android:gravity="center"
android:background="@drawable/edit_bg"/>
<ImageButton
android:id="@+id/image_add"
android:layout_width="30dp"
android:layout_height="30dp"
android:background="@drawable/ic_action_add"
/>
</LinearLayout>
自定义view的类AddSubView
package com.example.renzhili20181220.view;
import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.Toast;
import com.example.renzhili20181220.R;
import com.example.renzhili20181220.adapter.MyChiledAdapter;
import com.example.renzhili20181220.adapter.MyZiAdapter;
import com.example.renzhili20181220.bean.CliedBean;
import java.util.ArrayList;
import java.util.List;
public class AddSubView extends LinearLayout implements View.OnClickListener {
private ImageButton image_sub,image_add;
private EditText edit_text;
private int num;
private Context context;
public AddSubView(Context context) {
super(context);
init(context);
}
public AddSubView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public AddSubView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
this.context=context;
View view = View.inflate(context, R.layout.addsubview,null);
//获取id
image_sub=view.findViewById(R.id.image_sub);
image_add=view.findViewById(R.id.image_add);
edit_text=view.findViewById(R.id.edit_text);
//点击事件
image_sub.setOnClickListener(this);
image_add.setOnClickListener(this);
addView(view);
edit_text.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
num=Integer.valueOf(String.valueOf(s));
try {
list.get(position).setNum(num);
}catch (Exception e){
list.get(position).setNum(1);
}
if (callBackListener!=null){
callBackListener.callback();
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.image_add:
num++;
edit_text.setText(num+"");
list.get(position).setNum(num);
if (callBackListener!=null){
callBackListener.callback();
}
myZiAdapter.notifyItemChanged(position);
break;
case R.id.image_sub:
if (num>1){
num--;
}else{
Toast.makeText(context,"最少为1",Toast.LENGTH_SHORT).show();
}
edit_text.setText(num+"");
list.get(position).setNum(num);
if (callBackListener!=null){
callBackListener.callback();
}
myZiAdapter.notifyItemChanged(position);
break;
default:
break;
}
}
//传递数据
private List<CliedBean.DataBean.ListBean> list = new ArrayList<>();
private int position;
private MyZiAdapter myZiAdapter;
public void setList(List<CliedBean.DataBean.ListBean> list,int position, MyZiAdapter myZiAdapter) {
this.list = list;
this.myZiAdapter = myZiAdapter;
this.position=position;
num=list.get(position).getNum();
edit_text.setText(num+"");
}
//声明接口
CallBackListener callBackListener;
public void setOnCallBackListener(CallBackListener callBackListener){
this.callBackListener=callBackListener;
}
//接口
public interface CallBackListener{
void callback();
}
}