圆形搜索框
main_activity.xml布局(这是fragment)
<TextView
android:id="@+id/show"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="首页"
android:textSize="20sp"
/>
<TextView
android:id="@+id/fenlei"
android:layout_width="131dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="分类"
android:textSize="20sp" />
<TextView
android:id="@+id/shop"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="购物"
android:textSize="20sp"
/>
mainactivity页面(实现fragment)
package com.umeng.soexample.a1121day19;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import com.umeng.soexample.a1121day19.fragment.FenleiFragment;
import com.umeng.soexample.a1121day19.fragment.ShopFragment;
import com.umeng.soexample.a1121day19.fragment.ShouyeFragment;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private TextView show;
private TextView fenlei;
private TextView shop;
private ViewPager vp;
private List list;
private List mFragments;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show=findViewById(R.id.show);
fenlei=findViewById(R.id.fenlei);
shop=findViewById(R.id.shop);
vp=findViewById(R.id.vp);
list=new ArrayList<>();
mFragments=new ArrayList<>();
mFragments.add(new ShouyeFragment());
mFragments.add(new FenleiFragment());
mFragments.add(new ShopFragment());
show.setOnClickListener(this);
fenlei.setOnClickListener(this);
shop.setOnClickListener(this);
vp.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
@Override
public Fragment getItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return mFragments.size();
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.show:
vp.setCurrentItem(0);
break;
case R.id.fenlei:
vp.setCurrentItem(1);
break;
case R.id.shop:
vp.setCurrentItem(2);
break;
}
}
}
然后是三个fragment页面的功能实现
首页的布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyview"
android:layout_width=“match_parent”
android:layout_height=“wrap_content”></android.support.v7.widget.RecyclerView>
先是固定的httputils
utils包的HttpUtils页面
package com.umeng.soexample.a1121day19.utils;
import android.os.Handler;
import com.google.gson.Gson;
import com.umeng.soexample.a1121day19.callback.ICallBcak;
import java.io.IOException;
import java.lang.reflect.Type;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
/**
- Created by lenovo on 2018-11-21.
*/
public class HttpUtils {
private static volatile HttpUtils instance;
private OkHttpClient client;
private Handler handler = new Handler();
private HttpUtils(){
client=new OkHttpClient();
}
public static HttpUtils getInstance(){
if (instance == null){
synchronized (HttpUtils.class){
if (null == instance){
instance = new HttpUtils();
}
}
}
return instance;
}
public void get(String url, final ICallBcak callBack, final Type type){
Request request = new Request.Builder()
.url(url)
.get()
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
callBack.onFailed(e);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String string = response.body().string();
Gson gson = new Gson();
final Object o = gson.fromJson(string, type);
handler.post(new Runnable() {
@Override
public void run() {
callBack.onSuccess(o);
}
});
}
});
}
}
固定的callback
callback包里的ICallBack页面
package com.umeng.soexample.a1121day19.callback;
/**
- Created by lenovo on 2018-11-21.
*/
public interface ICallBcak {
void onSuccess(Object o);
void onFailed(Exception e);
}
接下来是首页的mvp
frist包里的model presenter view
NewsModel页面
package com.umeng.soexample.a1121day19.frist.model;
import com.umeng.soexample.a1121day19.callback.ICallBcak;
import com.umeng.soexample.a1121day19.utils.HttpUtils;
import java.lang.reflect.Type;
/**
- Created by lenovo on 2018-11-21.
*/
public class NewsModel {
public void getNews(String url, ICallBcak callBack, Type type){
HttpUtils.getInstance().get(url,callBack,type);
}
}
NewsPresenter页面
package com.umeng.soexample.a1121day19.frist.presenter;
import com.google.gson.reflect.TypeToken;
import com.umeng.soexample.a1121day19.bean.News;
import com.umeng.soexample.a1121day19.callback.ICallBcak;
import com.umeng.soexample.a1121day19.frist.model.NewsModel;
import com.umeng.soexample.a1121day19.frist.view.IView;
import java.lang.reflect.Type;
/**
- Created by lenovo on 2018-11-21.
*/
public class NewsPresenter {
private IView iv;
private NewsModel newsModel;
public void attach(IView iv) {
this.iv = iv;
newsModel = new NewsModel();
}
public void get(){
Type type = new TypeToken<News>(){}.getType();
newsModel.getNews("http://www.xieast.com/api/news/news.php", new ICallBcak() {
@Override
public void onSuccess(Object o) {
News newsBean = (News) o;
if (newsBean != null){
iv.onSuccess(newsBean.getData());
}
}
@Override
public void onFailed(Exception e) {
iv.onFailed(e);
}
},type);
}
}
NewsView页面
package com.umeng.soexample.a1121day19.frist.view;
import com.umeng.soexample.a1121day19.bean.News;
import java.util.List;
/**
- Created by lenovo on 2018-11-21.
*/
public interface IView {
void onSuccess(List<News.DataBean> list);
void onFailed(Exception e);
}
bean包里的News实现接口
adapter包里的NewsAdapter
package com.umeng.soexample.a1121day19.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.umeng.soexample.a1121day19.R;
import com.umeng.soexample.a1121day19.bean.News;
import java.util.List;
/**
- Created by lenovo on 2018-11-21.
*/
public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder>{
private Context context;
private List<News.DataBean> list;
public NewsAdapter(Context context, List<News.DataBean> list) {
this.context = context;
this.list = list;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v=View.inflate(context, R.layout.item_news,null);
ViewHolder holder=new ViewHolder(v);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Glide.with(context).load(list.get(position).getThumbnail_pic_s()).into(holder.img);
holder.title.setText(list.get(position).getTitle());
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private ImageView img;
private TextView title;
public ViewHolder(View itemView) {
super(itemView);
img=itemView.findViewById(R.id.img);
title=itemView.findViewById(R.id.title);
}
}
}
NewsAdapter里的布局item_news
<?xml version="1.0" encoding="utf-8"?>
<ImageView
android:id="@+id/img"
android:layout_width=“175dp”
android:layout_height=“200dp”
/>
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
显示首页的数据页面首页fragment页面
package com.umeng.soexample.a1121day19.fragment;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.umeng.soexample.a1121day19.R;
import com.umeng.soexample.a1121day19.adapter.NewsAdapter;
import com.umeng.soexample.a1121day19.bean.News;
import com.umeng.soexample.a1121day19.frist.presenter.NewsPresenter;
import com.umeng.soexample.a1121day19.frist.view.IView;
import java.util.ArrayList;
import java.util.List;
/**
- Created by lenovo on 2018-11-21.
*/
public class ShouyeFragment extends Fragment implements IView{
private RecyclerView recyview;
private NewsAdapter adapter;
private List<News.DataBean> listBeans;
private NewsPresenter presenter;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.shouye_fragment, null, false);
recyview= v.findViewById(R.id.recyview);
return v;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
RecyclerView.LayoutManager manager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
recyview.setLayoutManager(manager);
listBeans = new ArrayList<>();
adapter = new NewsAdapter(getActivity(),listBeans);
recyview.setAdapter(adapter);
presenter = new NewsPresenter();
presenter.attach(this);
presenter.get();
}
@Override
public void onSuccess(List<News.DataBean> list) {
if (list != null){
listBeans.clear();
listBeans.addAll(list);
adapter.notifyDataSetChanged();
}
}
@Override
public void onFailed(Exception e) {
Toast.makeText(getActivity(),"错误",Toast.LENGTH_LONG).show();
}
}
加权限首页面完成
第二个分类功能
分类的布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_main"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"></android.support.v7.widget.RecyclerView>
<ScrollView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="8">
<LinearLayout
android:id="@+id/ll_next"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"></LinearLayout>
</ScrollView>
</LinearLayout>
分类的mvp创建
classify包里的 model presenter view
Model页面
package com.umeng.soexample.a1121day19.classify.model;
import com.umeng.soexample.a1121day19.callback.ICallBcak;
import com.umeng.soexample.a1121day19.utils.HttpUtils;
import java.lang.reflect.Type;
/**
- Created by lenovo on 2018-11-21.
*/
public class Model {
public void getSuccess(String url, ICallBcak callBack, Type type){
HttpUtils.getInstance().get(url,callBack,type);
}
}
ClassifyPresenter页面
package com.umeng.soexample.a1121day19.classify.presenter;
import com.google.gson.reflect.TypeToken;
import com.umeng.soexample.a1121day19.bean.MainClassifyBean;
import com.umeng.soexample.a1121day19.bean.NextClassifyBean;
import com.umeng.soexample.a1121day19.callback.ICallBcak;
import com.umeng.soexample.a1121day19.classify.model.Model;
import com.umeng.soexample.a1121day19.classify.view.ClassifyView;
import java.lang.reflect.Type;
/**
- Created by lenovo on 2018-11-21.
*/
public class ClassifyPresenter {
private ClassifyView cv;
private Model model;
public void attach(ClassifyView cv) {
this.cv = cv;
model = new Model();
}
public void detch() {
if (cv != null) {
cv = null;
}
}
public void getMainclassify(){
Type type = new TypeToken<MainClassifyBean>(){}.getType();
model.getSuccess("http://www.zhaoapi.cn/product/getCatagory", new ICallBcak() {
@Override
public void onSuccess(Object o) {
MainClassifyBean mainClassifyBean = (MainClassifyBean) o;
if (mainClassifyBean != null){
cv.getMainClassify(mainClassifyBean.getData());
}
}
@Override
public void onFailed(Exception e) {
cv.getFailed(e);
}
},type);
}
public void getNextClassify(String url){
Type type = new TypeToken<NextClassifyBean>(){}.getType();
model.getSuccess(url, new ICallBcak() {
@Override
public void onSuccess(Object o) {
NextClassifyBean nextClassifyBean = (NextClassifyBean) o;
if (nextClassifyBean != null){
cv.getNextClassify(nextClassifyBean.getData());
}
}
@Override
public void onFailed(Exception e) {
cv.getFailed(e);
}
},type);
}
}
ClassifyView页面
package com.umeng.soexample.a1121day19.classify.view;
import com.umeng.soexample.a1121day19.bean.MainClassifyBean;
import com.umeng.soexample.a1121day19.bean.NextClassifyBean;
import java.util.List;
/**
- Created by lenovo on 2018-11-21.
*/
public interface ClassifyView {
void getMainClassify(List<MainClassifyBean.DataBean> list);
void getNextClassify(List<NextClassifyBean.DataBean> list);
void getFailed(Exception e);
}
mvp写完 开始 Adapter
MainClassifyAdapter页面
package com.umeng.soexample.a1121day19.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.umeng.soexample.a1121day19.R;
import com.umeng.soexample.a1121day19.bean.MainClassifyBean;
import java.util.List;
/**
- Created by lenovo on 2018-11-21.
*/
public class MainClassifyAdapter extends RecyclerView.Adapter<MainClassifyAdapter.ViewHolder>{
private Context context;
private List<MainClassifyBean.DataBean> list;
public MainClassifyAdapter(Context context, List<MainClassifyBean.DataBean> list) {
this.context = context;
this.list = list;
}
public interface OnItemClicklistener{
void onItemClick(View itemView,int position);
}
private OnItemClicklistener clicklistener;
public void getOnItemClicklistener(OnItemClicklistener clicklistener){
this.clicklistener = clicklistener;
}
@NonNull
@Override
public MainClassifyAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v= View.inflate(context, R.layout.mainclassify_item,null);
ViewHolder holder=new ViewHolder(v);
return holder;
}
@Override
public void onBindViewHolder(@NonNull MainClassifyAdapter.ViewHolder holder, final int position) {
holder.txtTitle.setText(list.get(position).getName());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (clicklistener != null){
clicklistener.onItemClick(v,position);
}
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private TextView txtTitle;
public ViewHolder(View itemView) {
super(itemView);
txtTitle=itemView.findViewById(R.id.txt_title);
}
}
}
mainclassifyadapter里的布局mainclassify_item
<?xml version="1.0" encoding="utf-8"?><TextView
android:id="@+id/txt_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:textSize="20dp" />
NextClassifyAdapter页面
package com.umeng.soexample.a1121day19.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.umeng.soexample.a1121day19.R;
import com.umeng.soexample.a1121day19.bean.NextClassifyBean;
import java.util.List;
/**
- Created by lenovo on 2018-11-21.
*/
public class NextClassifyAdapter extends RecyclerView.Adapter<NextClassifyAdapter.ViewHolder>{
private Context context;
private List<NextClassifyBean.DataBean.ListBean> list;
public NextClassifyAdapter(Context context, List<NextClassifyBean.DataBean.ListBean> list) {
this.context = context;
this.list = list;
}
@NonNull
@Override
public NextClassifyAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = View.inflate(context, R.layout.nextclassify_item, null);
ViewHolder holder=new ViewHolder(v);
return holder;
}
@Override
public void onBindViewHolder(@NonNull NextClassifyAdapter.ViewHolder holder, int position) {
Glide.with(context).load(list.get(position).getIcon()).into(holder.imgNext);
holder.txtNext.setText(list.get(position).getName());
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private ImageView imgNext;
private TextView txtNext;
public ViewHolder(View itemView) {
super(itemView);
imgNext = itemView.findViewById(R.id.img_next);
txtNext = itemView.findViewById(R.id.txt_next);
}
}
}
NextClassifyAdapter里的布局nextclassify_item
<?xml version="1.0" encoding="utf-8"?><ImageView
android:id="@+id/img_next"
android:layout_width="50dp"
android:layout_height="50dp" />
<TextView
android:id="@+id/txt_next"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
分类 fenleifragment页面
package com.umeng.soexample.a1121day19.fragment;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.GridLayoutManager;
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.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.umeng.soexample.a1121day19.R;
import com.umeng.soexample.a1121day19.adapter.MainClassifyAdapter;
import com.umeng.soexample.a1121day19.adapter.NextClassifyAdapter;
import com.umeng.soexample.a1121day19.bean.MainClassifyBean;
import com.umeng.soexample.a1121day19.bean.NextClassifyBean;
import com.umeng.soexample.a1121day19.classify.presenter.ClassifyPresenter;
import com.umeng.soexample.a1121day19.classify.view.ClassifyView;
import java.util.ArrayList;
import java.util.List;
/**
- Created by lenovo on 2018-11-21.
*/
public class FenleiFragment extends Fragment implements ClassifyView{
private RecyclerView rvMain;
private LinearLayout llNext;
private MainClassifyAdapter mainClassifyAdapter;
private NextClassifyAdapter nextClassifyAdapter;
private List<MainClassifyBean.DataBean> mainList;
private ClassifyPresenter presenter;
private List<NextClassifyBean.DataBean> nextList;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fenlei_fragment, null, false);
rvMain = v.findViewById(R.id.rv_main);
llNext = v.findViewById(R.id.ll_next);
return v;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initView();
initData();
}
private void initData() {
mainClassifyAdapter.getOnItemClicklistener(new MainClassifyAdapter.OnItemClicklistener() {
@Override
public void onItemClick(View itemView, int position) {
MainClassifyBean.DataBean dataBean = mainList.get(position);
presenter.getNextClassify("http://www.zhaoapi.cn/product/getProductCatagory?cid="+dataBean.getCid());
}
});
}
private void initView() {
mainList = new ArrayList<>();
nextList = new ArrayList<>();
mainClassifyAdapter = new MainClassifyAdapter(getContext(),mainList);
RecyclerView.LayoutManager manager = new LinearLayoutManager(getContext());
rvMain.setLayoutManager(manager);
rvMain.setAdapter(mainClassifyAdapter);
presenter = new ClassifyPresenter();
presenter.attach(this);
presenter.getMainclassify();
}
@Override
public void getMainClassify(List<MainClassifyBean.DataBean> list) {
if (list != null){
mainList.clear();
mainList.addAll(list);
mainClassifyAdapter.notifyDataSetChanged();
}
}
@Override
public void getNextClassify(List<NextClassifyBean.DataBean> list) {
if (list != null){
llNext.removeAllViews();
for (int i = 0; i <list.size() ; i++) {
TextView textView = new TextView(getContext());
textView.setText(list.get(i).getName());
RecyclerView recyclerView = new RecyclerView(getContext());
RecyclerView.LayoutManager manager = new GridLayoutManager(getContext(),3);
recyclerView.setLayoutManager(manager);
nextClassifyAdapter = new NextClassifyAdapter(getContext(),list.get(i).getList());
recyclerView.setAdapter(nextClassifyAdapter);
nextList.clear();
nextList.addAll(list);
nextClassifyAdapter.notifyDataSetChanged();
llNext.addView(textView);
llNext.addView(recyclerView);
}
}
}
@Override
public void getFailed(Exception e) {
Toast.makeText(getContext(),"网络连接错误",Toast.LENGTH_SHORT).show();
}
@Override
public void onResume() {
super.onResume();
presenter.getNextClassify("http://www.zhaoapi.cn/product/getProductCatagory?cid=1");
}
@Override
public void onDestroy() {
super.onDestroy();
if (presenter != null){
presenter.detch();
}
}
}
第三个功能购物车
shop_fragment布局
<?xml version="1.0" encoding="utf-8"?>
adapter里的MyAdapter是购物车的adapter
MyAdapter页面
package com.umeng.soexample.a1121day19.adapter;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.umeng.soexample.a1121day19.MyAddSubView;
import com.umeng.soexample.a1121day19.R;
import com.umeng.soexample.a1121day19.bean.CartInfo;
import java.util.List;
/**
- Created by lenovo on 2018-11-21.
*/
public class MyAdapter extends BaseExpandableListAdapter{
private List<CartInfo.DataBean> sellerData;
private Context context;
public MyAdapter(List<CartInfo.DataBean> sellerData, Context context) {
this.sellerData = sellerData;
this.context = context;
}
@Override
public int getGroupCount() {
return sellerData.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return sellerData.get(groupPosition).getList().size();
}
@Override
public Object getGroup(int groupPosition) {
return null;
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return null;
}
@Override
public long getGroupId(int groupPosition) {
return 0;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return 0;
}
@Override
public boolean hasStableIds() {
return false;
}
/////////////////
@Override
public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
GroupViewHolder groupViewHolder = null;
if (convertView == null){
groupViewHolder = new GroupViewHolder();
convertView = View.inflate(context, R.layout.group_view_layout_shopcar, null);
groupViewHolder.cb_group_item = convertView.findViewById(R.id.cb_group_item);
groupViewHolder.tv_title_group = convertView.findViewById(R.id.tv_title_group);
convertView.setTag(groupViewHolder);
}else {
groupViewHolder = (GroupViewHolder) convertView.getTag();
}
//赋值
CartInfo.DataBean dataBean = sellerData.get(groupPosition);
//商家名称
groupViewHolder.tv_title_group.setText(dataBean.getSellerName());
boolean b = isCurrentSellerAllProductSelected(groupPosition);
//商家的checkbox
groupViewHolder.cb_group_item.setChecked(b);
//点击checkbox触发监听
groupViewHolder.cb_group_item.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onCartListChangeListener != null) {
onCartListChangeListener.SellerSelectedChange(groupPosition);
}
}
});
return convertView;
}
public void changeCurrentSellerAllProductSelected(int Position, boolean b) {
List<CartInfo.DataBean.ListBean> list = sellerData.get(Position).getList();
for (int i = 0; i < list.size(); i++) {
list.get(i).setSelected(b ? 1 : 0);
}
}
public boolean isCurrentSellerAllProductSelected(int position) {
List<CartInfo.DataBean.ListBean> list = sellerData.get(position).getList();
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getSelected() == 0) {
return false;
}
}
return true;
}
/////////////////////////////////////////////////////
@Override
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ChildViewHolder childViewHolder = null;
if (convertView == null) {
childViewHolder = new ChildViewHolder();
convertView = View.inflate(context, R.layout.child_view_layout_shopcar, null);
childViewHolder.cb_child_item = convertView.findViewById(R.id.cb_child_item);
childViewHolder.tv_title_child = convertView.findViewById(R.id.tv_title_child);
childViewHolder.tv_price_child = convertView.findViewById(R.id.tv_price_child);
childViewHolder.iv_icon_child = convertView.findViewById(R.id.iv_icon_child);
childViewHolder.add_sub_view_child = convertView.findViewById(R.id.add_sub_view_child);
convertView.setTag(childViewHolder);
} else {
childViewHolder = (ChildViewHolder) convertView.getTag();
}
//赋值
CartInfo.DataBean.ListBean listBean = sellerData.get(groupPosition).getList().get(childPosition);
//商品名称
childViewHolder.tv_title_child.setText(listBean.getTitle());
//商品图片
String images = listBean.getImages();
String[] split = images.split("\\|");
Glide.with(context).load(split[0]).into(childViewHolder.iv_icon_child);
//商品价格
childViewHolder.tv_price_child.setText("¥" + listBean.getPrice());
//商品checkb0x
childViewHolder.cb_child_item.setChecked(listBean.getSelected() == 1);
childViewHolder.cb_child_item.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onCartListChangeListener.changeCurrentProductSelected(groupPosition, childPosition);
}
});
childViewHolder.add_sub_view_child.setOnNumberChangeListener(new MyAddSubView.OnNumberChangeListener() {
@Override
public void OnNumberChange(int number) {
onCartListChangeListener.ProductNumberChange(groupPosition, childPosition, number);
}
});
return convertView;
}
public void changeCurrentProductNumber(int groupPosition, int childPosition, int number) {
CartInfo.DataBean.ListBean listBean = sellerData.get(groupPosition).getList().get(childPosition);
listBean.setNum(number);
}
public void changeCurrentProductSelected(int groupPosition, int childPosition) {
CartInfo.DataBean.ListBean listBean = sellerData.get(groupPosition).getList().get(childPosition);
listBean.setSelected(listBean.getSelected() == 0 ? 1 : 0);
}
public double calculateTotalPrice() {
double totalPrice = 0;
for (int i = 0; i < sellerData.size(); i++) {
List<CartInfo.DataBean.ListBean> list = sellerData.get(i).getList();
for (int j = 0; j < list.size(); j++) {
//只有选中采取计算
if (list.get(j).getSelected() == 1) {
double price = list.get(j).getPrice();
int num = list.get(j).getNum();
totalPrice += price * num;
}
}
}
return totalPrice;
}
public int calculateTotalNumber() {
int totalNumber = 0;
for (int i = 0; i < sellerData.size(); i++) {
List<CartInfo.DataBean.ListBean> list = sellerData.get(i).getList();
for (int j = 0; j < list.size(); j++) {
//只有选中采取计算
if (list.get(j).getSelected() == 1) {
int num = list.get(j).getNum();
totalNumber += num;
}
}
}
return totalNumber;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}
public boolean isAllProductsSelected() {
for (int i = 0; i < sellerData.size(); i++) {
List<CartInfo.DataBean.ListBean> list = sellerData.get(i).getList();
for (int j = 0; j < list.size(); j++) {
if (list.get(j).getSelected() == 0) {
return false;
}
}
}
return true;
}
public void changeAllProductsSelected(boolean b) {
for (int i = 0; i < sellerData.size(); i++) {
List<CartInfo.DataBean.ListBean> list = sellerData.get(i).getList();
for (int j = 0; j < list.size(); j++) {
list.get(j).setSelected(b ? 1 : 0);
}
}
}
public static class GroupViewHolder {
public CheckBox cb_group_item;
public TextView tv_title_group;
}
public static class ChildViewHolder {
public CheckBox cb_child_item;
public ImageView iv_icon_child;
public TextView tv_title_child;
public TextView tv_price_child;
public MyAddSubView add_sub_view_child;
}
OnCartListChangeListener onCartListChangeListener;
public void setOnCartListChangeListener(OnCartListChangeListener onCartListChangeListener) {
this.onCartListChangeListener = onCartListChangeListener;
}
public interface OnCartListChangeListener {
void SellerSelectedChange(int groupPosition);
void changeCurrentProductSelected(int groupPosition, int childPosition);
void ProductNumberChange(int groupPosition, int childPosition, int number);
}
}
MyAdapter里的布局
group_view_layout_shopcar布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout
xmlns:android=“http://schemas.android.com/apk/res/android”
android:layout_width=“match_parent”
android:layout_height=“60dp”
android:orientation=“horizontal”
>
<CheckBox
android:id="@+id/cb_group_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_title_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:ellipsize="end"
android:maxLines="2"
android:text="标题"
android:textColor="#000"
android:textSize="20sp"
/>
child_view_layout_shopcar布局
<?xml version="1.0" encoding="utf-8"?>
</LinearLayout>
///////////导自己的包/////
<com.umeng.soexample.a1121day19.MyAddSubView
android:id="@+id/add_sub_view_child"
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”></com.umeng.soexample.a1121day19.MyAddSubView>
然后是自定义控件加减器
add_sub_view布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout
xmlns:android=“http://schemas.android.com/apk/res/android”
android:layout_width=“80dp”
android:layout_height=“30dp”
android:layout_gravity=“center_vertical”
android:orientation=“horizontal”
android:background="#000"
android:padding=“2dp”
>
<TextView
android:id="@+id/tv_sub_view"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#fff"
android:gravity="center"
android:text="-"
android:textColor="#000"
/>
<TextView
android:id="@+id/tv_number_view"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
android:layout_weight="1"
android:background="#fff"
android:gravity="center"
android:text="1"
android:textColor="#000"
/>
<TextView
android:id="@+id/tv_add_view"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#fff"
android:gravity="center"
android:text="+"
android:textColor="#000"
/>
MyAddSubView页面
package com.umeng.soexample.a1121day19;
import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
/**
- Created by lenovo on 2018-11-21.
*/
public class MyAddSubView extends LinearLayout implements View.OnClickListener{
TextView tv_sub_view;
TextView tv_number_view;
TextView tv_add_view;
private int number = 1;
public int getNumber(){
return number;
}
public void setNumber(int number){
this.number=number;
tv_number_view.setText(number+"");
}
public MyAddSubView(Context context) {
super(context);
}
//////////////////////
public MyAddSubView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
View inflate = View.inflate(context, R.layout.add_sub_view,this);
tv_sub_view = inflate.findViewById(R.id.tv_sub_view);
tv_number_view = inflate.findViewById(R.id.tv_number_view);
tv_add_view = inflate.findViewById(R.id.tv_add_view);
tv_add_view.setOnClickListener(this);
tv_sub_view.setOnClickListener(this);
}
OnNumberChangeListener onNumberChangeListener;
public void setOnNumberChangeListener(OnNumberChangeListener onNumberChangeListener){
this.onNumberChangeListener=onNumberChangeListener;
}
@Override
public void onClick(View v) {
}
public interface OnNumberChangeListener{
void OnNumberChange(int number);
}
}
shopfragment页面
package com.umeng.soexample.a1121day19.fragment;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ExpandableListView;
import android.widget.TextView;
import com.google.gson.Gson;
import com.umeng.soexample.a1121day19.MainActivity;
import com.umeng.soexample.a1121day19.R;
import com.umeng.soexample.a1121day19.adapter.MyAdapter;
import com.umeng.soexample.a1121day19.bean.CartInfo;
import java.io.IOException;
import java.util.List;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
/**
- Created by lenovo on 2018-11-21.
*/
public class ShopFragment extends Fragment implements View.OnClickListener{
public static final String TAG = “ShopFragment”;
String url = “http://www.zhaoapi.cn/product/getCarts?uid=71”;
private ExpandableListView elc_show_main;
private CheckBox cb_allCheck_main;
private TextView btn_allPrice_main;
private Button btn_allNumber_main;
private MyAdapter myAdapter;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.shop_fragment, null, false);
elc_show_main = v.findViewById(R.id.elc_show_main);
cb_allCheck_main = v.findViewById(R.id.cb_allCheck_main);
btn_allPrice_main = v.findViewById(R.id.btn_allprice_main);
btn_allNumber_main =v.findViewById(R.id.btn_allNumber_main);
cb_allCheck_main.setOnClickListener(this);
btn_allNumber_main.setOnClickListener(this);
initData();
return v;
}
private void initData() {
//得到okhttp
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
Request request = new Request.Builder().url(url).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(final Call call, Response response) throws IOException {
final String string = response.body().string();
getActivity().runOnUiThread( new Runnable() {
private List<CartInfo.DataBean> sellerData;
@Override
public void run() {
Gson gson = new Gson();
CartInfo cartInfo = gson.fromJson(string, CartInfo.class);
sellerData = cartInfo.getData();
//创建适配
//创建适配
myAdapter = new MyAdapter(sellerData,getActivity());
//调用适配器的借口 来实现回电数据
myAdapter.setOnCartListChangeListener(new MyAdapter.OnCartListChangeListener() {
@Override
public void SellerSelectedChange(int groupPosition) {
//先得到 checkbox
boolean b = myAdapter.isCurrentSellerAllProductSelected(groupPosition);
//改变所有当前商家的选中状态
myAdapter.changeCurrentSellerAllProductSelected(groupPosition,!b);
myAdapter.notifyDataSetChanged();
refreshAllSelectedAndTotalPriceAndTotalNumber();
}
@Override
public void changeCurrentProductSelected(int groupPosition, int childPosition) {
myAdapter.changeCurrentProductSelected(groupPosition,childPosition);
myAdapter.notifyDataSetChanged();
refreshAllSelectedAndTotalPriceAndTotalNumber();
}
@Override
public void ProductNumberChange(int groupPosition, int childPosition, int number) {
myAdapter.changeCurrentProductNumber(groupPosition,childPosition,number);
myAdapter.notifyDataSetChanged();
//刷新底部的方法
refreshAllSelectedAndTotalPriceAndTotalNumber();
}
});
elc_show_main.setAdapter(myAdapter);
for (int i = 0; i < sellerData.size() ; i++) {
elc_show_main.expandGroup(i);
}
}
});
}
});
}
private void refreshAllSelectedAndTotalPriceAndTotalNumber(){
boolean allProductsSelected = myAdapter.isAllProductsSelected();
cb_allCheck_main.setChecked(allProductsSelected);
//计算总金额
Double totalPrice = myAdapter.calculateTotalPrice();
btn_allPrice_main.setText(“总价:¥”+totalPrice);
//计算总数量
int totalNumber = myAdapter.calculateTotalNumber();
btn_allNumber_main.setText(“去结算(”+totalNumber+")");
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_allNumber_main:
break;
case R.id.cb_allCheck_main:
boolean allProductsSelected = myAdapter.isAllProductsSelected();
myAdapter.changeAllProductsSelected(!allProductsSelected);
myAdapter.notifyDataSetChanged();
//刷新底部的方法
refreshAllSelectedAndTotalPriceAndTotalNumber();
break;
}
}
}