1.购物车的存储器
2.显示购物车商品
3.对商品分页进行封装
4.商品排序功能的实现
一.将热卖商品加入购物车,然后对购物车中的商品进行显示
1.CartProvider的原理: 1.将ShoppingCart对象放入在内存中 put delete update
2.将内存中的对象转换成
List<ShoppingCart>集合
3.将List集合转换成json -->
new
Gson().toJson(carts)保存到sharedPreference中
4.当初始化的时候,需要将sharedPreference中json--->
new
Gson().fromJson(json,
new
TypeToken<List<ShoppingCart>>(){
}.getType());变成List集合
5.再将list集合转换成ShoppingCart对象放入到内存中
(这样下次put的时候就可以读取到内存中的对象执行操作)
/**
* Created by asus on 2016/10/26.
* 购物车
*/
public class CartProvider {
public static final String CART_JSON = "cart_json";
private Context mcontext;
private SparseArray<ShoppingCart> datas = null;
public CartProvider(Context context) {
mcontext = context;
datas = new SparseArray<>(10);//初始化10条数据类型于hashMap
listToSparse();//初始化時就将本地中的数据放到内存中
}
//1.放对象到SparseArray集合中(内存)
public void put(ShoppingCart cart) {
//先判断datas里面的key是否有这个id,如果里面已经有了,就将count+1,没有的话就保存进去
ShoppingCart temp = datas.get(cart.getId().intValue());
if (temp != null) {
temp.setCount(temp.getCount() + 1);
} else {//没有就保存进去
temp = cart;
temp.setCount(1);//并设置为1
}
datas.put(cart.getId().intValue(), temp);
commit();
}
//更新
public void update(ShoppingCart cart) {
datas.put(cart.getId().intValue(), cart);
commit();
}
//删除
public void delete(ShoppingCart cart) {
datas.delete(cart.getId().intValue());
commit();
}
public List<ShoppingCart> getAll() {
return getDataFromLocal();
}
将内存对象存放在本地
public void commit() {
List<ShoppingCart> carts = sparseTolist();//获取list集合
//toJson是将对象转换成json字符串,而fromjson是将json字符串转换成对象
//必须转换成json,因为sharedPreference不支持list集合对象
PreferencesUtils.putString(mcontext, CART_JSON, JSONUtil.toJSON(carts));
}
//从本地获取
private List<ShoppingCart> getDataFromLocal() {
String json = PreferencesUtils.getString(mcontext, CART_JSON);
List<ShoppingCart> carts = null;
if (json != null) {
//这里解析的是List类型,所以当将SparseArray保存到本地的时候需要转换成List集合
carts = JSONUtil.fromJson(json, new TypeToken<List<ShoppingCart>>() {
}.getType());
}
return carts;
}
//1.将对象集合的数据添加到List集合中
public List<ShoppingCart> sparseTolist() {
int size = datas.size();
List<ShoppingCart> list = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
list.add(datas.valueAt(i));
}
return list;
}
//2.将list集合转换成对象集合
private void listToSparse() {
List<ShoppingCart> carts = getDataFromLocal();
if (carts != null && carts.size() > 0) {
for (ShoppingCart cart :
carts) {
//防盗内存中
datas.put(cart.getId().intValue(), cart);
}
}
}
}
二.购物车页面
/**
* 购物车页面
*/
public class CartFragment extends Fragment implements View.OnClickListener {
@ViewInject(R.id.recycler_view)
private RecyclerView mRecyclerView;
@ViewInject(R.id.checkbox_all)
private CheckBox mCheckBox;
@ViewInject(R.id.txt_total)
private TextView mTextTotal;
@ViewInject(R.id.btn_order)
private Button mBtnOrder;
@ViewInject(R.id.btn_del)
private Button mBtnDel;
private CartProvider cartProvider;
private CartAdapter mAdapter;
private CnToolbar cntoolbar;
private List<ShoppingCart> carts;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_cart, container, false);
ViewUtils.inject(this, view);
cartProvider = new CartProvider(getActivity());
showData();
return view;
}
private void showData() {
carts = cartProvider.getAll();//1.获取所有的购物车商品
mAdapter = new CartAdapter(carts,getActivity(),mCheckBox,mTextTotal);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(),DividerItemDecoration.VERTICAL_LIST));
mRecyclerView.setAdapter(mAdapter);
}
//当切换到cartfragment的时候刷新数据
public void refreshData() {
mAdapter.clearData();
List<ShoppingCart> carts = cartProvider.getAll();
mAdapter.addData(carts);
mAdapter.checkListen();
}
//获取toolbar
@Override
public void onAttach(Context context) {
super.onAttach(context);
MainActivity activity = (MainActivity) context;
cntoolbar = (CnToolbar) activity.findViewById(R.id.cntoolbar);
cntoolbar.getmRightImageButton().setOnClickListener(this);
cntoolbar.getmRightImageButton().setTag(ACTION_EDIT);//设置一个tag为编辑
}
private int ACTION_EDIT=1;
private int ACTION_FINISH=2;
/**
*编辑的点击事件
*/
@Override
public void onClick(View v) {
int action = (int) v.getTag();
if(action==ACTION_EDIT){
cntoolbar.getmRightImageButton().setText("完成");
mTextTotal.setVisibility(View.GONE);//总数隐藏
mBtnOrder.setVisibility(View.GONE);结算按钮
mBtnDel.setVisibility(View.VISIBLE);//删除按钮
cntoolbar.getmRightImageButton().setTag(ACTION_FINISH);//将tag设置为完成
mCheckBox.setChecked(false);//全选按钮
mAdapter.setAllCheckbox(false);
}else if(action==ACTION_FINISH){
cntoolbar.getmRightImageButton().setText("编辑");
mTextTotal.setVisibility(View.VISIBLE);//总数隐藏
mBtnOrder.setVisibility(View.VISIBLE);结算按钮
mBtnDel.setVisibility(View.GONE);//删除按钮
cntoolbar.getmRightImageButton().setTag(ACTION_EDIT);//将tag设置为编辑
mCheckBox.setChecked(true);//全选按钮
mAdapter.setAllCheckbox(true);
mAdapter.showTotalPrice();
}
}
//删除按钮的点击事件
@OnClick(R.id.btn_del)
public void delCart(View view){
mAdapter.deleteSelected();
}
}
2.购物车的适配器
/**
* Created by asus on 2016/10/26.
*
*
* 购物车的适配器(同时对页面的操作)
*/
public class CartAdapter extends BaseAdapter<ShoppingCart, BaseViewHolder> implements BaseAdapter.OnHotClickListener, View.OnClickListener {
public static final String TAG = "CartAdapter";
private CheckBox checkBox;//全选checkbox
private TextView textView;
private List<ShoppingCart> datas;
private NumAddSupView numadd_sup;
private CartProvider cartProvider;
public CartAdapter(List<ShoppingCart> datas, Context context, final CheckBox checkBox, TextView tv) {
super(datas, context, R.layout.template_cart);//recycleView的item
this.checkBox = checkBox;
this.textView = tv;
this.datas = datas;
cartProvider = new CartProvider(context);
setHotClickListener(this);//item的点击事件
checkBox.setOnClickListener(this);//权限按钮的点击事件
showTotalPrice();//默认展示总价格
}
@Override
public void bindData(BaseViewHolder viewHoder, final ShoppingCart shoppingCart) {
viewHoder.getTextView(R.id.text_title).setText(shoppingCart.getName());
viewHoder.getTextView(R.id.text_price).setText("¥" + shoppingCart.getPrice());
SimpleDraweeView draweeView = (SimpleDraweeView) viewHoder.getView(R.id.drawee_view);
draweeView.setImageURI(Uri.parse(shoppingCart.getImgUrl()));
CheckBox checkBox = (CheckBox) viewHoder.getView(R.id.checkbox);
//设置选择按钮
checkBox.setChecked(shoppingCart.isChecked());
//加减自定义控件
numadd_sup = (NumAddSupView) viewHoder.getView(R.id.num_control);
numadd_sup.setValue(shoppingCart.getCount());
numadd_sup.setOnButtonClickListener(new NumAddSupView.OnButtonClickListener() {
@Override//增加
public void onAddclick(View view, int value) {
shoppingCart.setCount(value);
cartProvider.update(shoppingCart);
showTotalPrice();
}
@Override//减少
public void onsupclick(View view, int value) {
shoppingCart.setCount(value);
cartProvider.update(shoppingCart);
showTotalPrice();
}
});
showTotalPrice();//默认展示总价格
}
//获取总价格
private float getTotalPrice() {
float sum = 0;
if (datas != null && datas.size() > 0)
for (ShoppingCart cart : datas) {
if (cart.isChecked())
sum += cart.getCount() * cart.getPrice();
}
return sum;
}
public void showTotalPrice() {
float total = getTotalPrice();
textView.setText(Html.fromHtml("合计: ¥<span style='color:#eb4f38'>" + total + "</span>"), TextView.BufferType.SPANNABLE);
}
//检查是否所有的都选中,如果都选中则设置全选
public void checkListen() {
int num = 0;
int size = 0;
if (datas != null) {
size = datas.size();//所有的item的个数
for (ShoppingCart cart : datas) {
if (cart.isChecked()) {//如果选中了,就增加选择的个数
num++;
}
}
if (num == size) {//如果选择的个数==总数,就设置全选
checkBox.setChecked(true);
} else {
checkBox.setChecked(false);
}
}
}
//item的点击事件,点击选择或者取消,更新总数
@Override
public void onclick(View view, int position) {
ShoppingCart shoppingCart = getItem(position);
if (shoppingCart != null) {
shoppingCart.setIsChecked(!shoppingCart.isChecked());//改变状态
notifyDataSetChanged();
checkListen();//检查如果都勾选了则设置全选
showTotalPrice();//显示价格
}
}
/**
* 全选按钮的点击事件
*/
@Override
public void onClick(View v) {
if (datas != null) {
for (ShoppingCart cart : datas) {
cart.setIsChecked(checkBox.isChecked());//如果全选按钮选中.则选中所有
}
notifyDataSetChanged();
}
showTotalPrice();
}
//根据传入的值设置每个按钮的状态
public void setAllCheckbox(boolean show) {
if (datas != null) {
for (ShoppingCart cart : datas) {
cart.setIsChecked(show);//如果全选按钮选中.则选中所有
}
notifyDataSetChanged();
}
}
//删除选中的item
public void deleteSelected() {
if (datas != null && datas.size() > 0) {
ArrayList<ShoppingCart> copys = new ArrayList<>();
for (ShoppingCart cart : datas) {
copys.add(cart);
}
for (ShoppingCart cart : copys) {
if (cart.isChecked()) {
datas.remove(cart);
cartProvider.delete(cart);
notifyDataSetChanged();
}
}
}
}
}
三.每个recycleView都涉及到了分页的操作(对分页进行封装)
package com.example.laoluo.play.utils;
import android.content.Context;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.view.View;
import android.widget.Toast;
import com.cjj.MaterialRefreshLayout;
import com.cjj.MaterialRefreshListener;
import com.example.laoluo.play.Contant.Contants;
import com.example.laoluo.play.adapter.BaseAdapter;
import com.example.laoluo.play.adapter.SimpleAdapter;
import com.example.laoluo.play.bean2.Page;
import com.example.laoluo.play.bean2.Wares;
import com.example.laoluo.play.http.OkHttpHelper;
import com.example.laoluo.play.http.SpotsCallBack;
import com.example.laoluo.play.widget.DividerItemDecoration;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.squareup.okhttp.Response;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by asus on 2016/10/27.
* 分页工具类封装.--------加油加油加油加油,你可以的!!!!!!!!!!!!!
*/
public class Pager {
private static final int STATE_NORMAL = 0;
private static final int STATE_REFREH = 1;
private static final int STATE_MORE = 2;
private int state = STATE_NORMAL;
private OkHttpHelper httpHelper;
public static Builder builder;
private Pager() {
httpHelper = OkHttpHelper.getInstance();
initRefreshLayout();//设置刷新控件
}
public static Builder newBuilder() {
builder = new Builder();
return builder;
}
public static class Builder {
private String mUrl;
private HashMap<String, Object> params = new HashMap<>(5);
private MaterialRefreshLayout mRefreshLayout;
private boolean canLoadMore;
//设置默认值
private int pageSize = 10;
private int totalPage = 1;
private int pageIndex = 1;
private boolean showDialog = false;
private OnPageListener onPageListener;
private Context mContext;
private Type mType;
private int showDialogCount = 0;
//1.设置url
public Builder setUrl(String url) {
builder.mUrl = url;
return builder;
}
//2.放置参数(总数和页数)
public Builder putParams(String key, Object value) {
params.put(key, value);
return builder;
}
//3.设置pageSize每一页的大小
public Builder setPageSize(int pageSize) {
this.pageSize = pageSize;
return builder;
}
//4.是否可以加载更多
public Builder setLoadMore(boolean loadMore) {
this.canLoadMore = loadMore;
return builder;
}
//5.刷新的控件
public Builder setRefreshLayout(MaterialRefreshLayout refreshLayout) {
this.mRefreshLayout = refreshLayout;
return builder;
}
//6.是否显示加载的dialog
public Builder setShowDialog(boolean showDialog) {
this.showDialog = showDialog;
return builder;
}
//7.设置监听刷新和加载更多
public Builder setOnPageListener(OnPageListener onPageListener) {
this.onPageListener = onPageListener;
return builder;
}
//8.设置上下文和传入的type
public Pager builder(Context context, Type type) {
this.mType = type;
this.mContext = context;
valid();
return new Pager();
}
//检测传入值是否为null
private void valid() {
if (this.mContext == null)
throw new RuntimeException("content can't be null");
if (this.mUrl == null || "".equals(this.mUrl))
throw new RuntimeException("url can't be null");
if (this.mRefreshLayout == null)
throw new RuntimeException("MaterialRefreshLayout can't be null");
}
}
//设置刷新
private void initRefreshLayout() {
builder.mRefreshLayout.setLoadMore(builder.canLoadMore);//设置加载更多
builder.mRefreshLayout.setMaterialRefreshListener(new MaterialRefreshListener() {
//下拉刷新的方法
@Override
public void onRefresh(MaterialRefreshLayout materialRefreshLayout) {
refreshData();
}
//加载更多
@Override
public void onRefreshLoadMore(MaterialRefreshLayout materialRefreshLayout) {
if (builder.pageIndex < builder.totalPage)
loadMoreData();
else {
ToastUtil.showToast(builder.mContext, "没有更多数据");
builder.mRefreshLayout.finishRefreshLoadMore();//取消加载更多
}
}
});
}
private void refreshData() {
builder.pageIndex = 1;
state = STATE_REFREH;
builder.showDialog = false;//设置不显示dialog
getData();
}
private void loadMoreData() {
builder.pageIndex++;
state = STATE_MORE;
builder.showDialog = false;//设置不显示dialog
getData();//重新加载数据
}
//获取数据
private void getData() {
// String url = Contants.API.WARES_HOT + "?curPage=" + builder.pageIndex + "&pageSize=" + builder.pageSize;
if (builder.showDialog == true) {
if (builder.showDialogCount < 1) {
builder.showDialogCount++;
}else{
builder.showDialog=false;
}
}
httpHelper.get(buildUrl(), new RequestCallBack(builder.mContext, builder.showDialog));
}
class RequestCallBack<T> extends SpotsCallBack<Page<T>> {
public RequestCallBack(Context context, boolean isShowDialog) {
super(context, isShowDialog);
//要将type赋值给父亲,否则是一个空指针
super.mType = builder.mType;
}
@Override
public void onSuccess(Response response, Page<T> pages) {
List<T> datas = pages.getList();//数据集合
builder.pageIndex = pages.getCurrentPage();//当前页
builder.pageSize = pages.getPageSize(); //每一页的个数
builder.totalPage = pages.getTotalPage();//总页数
showData(datas, builder.totalPage, pages.getTotalCount());
}
@Override
public void onError(Response response, int code, Exception e) {
}
}
//回调监听当刷新和加载更多的时候
private <T> void showData(List<T> datas, int totalPage, int totalCount) {
if(datas ==null|| datas.size()<=0){
Toast.makeText(builder.mContext,"加载不到数据",Toast.LENGTH_LONG).show();
return;
}
switch (state) {
case STATE_NORMAL://普通状态
if (builder.onPageListener != null) {
builder.onPageListener.load(datas, totalPage, totalCount);
}
break;
case STATE_REFREH://刷新状态
builder.mRefreshLayout.finishRefresh();
if (builder.onPageListener != null) {
builder.onPageListener.refresh(datas, totalPage, totalCount);
}
break;
case STATE_MORE://加载更多状态
builder.mRefreshLayout.finishRefreshLoadMore();//结束加载更多
if (builder.onPageListener != null) {
builder.onPageListener.loadMore(datas, totalPage, totalCount);
}
break;
}
}
/**
* 构建URL
*
* @return
*/
private String buildUrl() {
return builder.mUrl + "?" + buildUrlParams();
}
private String buildUrlParams() {
HashMap<String, Object> map = builder.params;
map.put("curPage", builder.pageIndex);
map.put("pageSize", builder.pageSize);
StringBuffer sb = new StringBuffer();
for (Map.Entry<String, Object> entry : map.entrySet()) {
sb.append(entry.getKey() + "=" + entry.getValue());
sb.append("&");
}
String s = sb.toString();
if (s.endsWith("&")) {
s = s.substring(0, s.length() - 1);
}
return s;
}
//让外界调用获取数据
public void request() {
getData();
}
//让外界对参数进行更改
public void putParam(String key, Object value) {
builder.params.put(key, value);
}
//设置回调监听,当normal。refreshing,loadmore
public interface OnPageListener<T> {
void load(List<T> datas, int totalPage, int totalCount);
void refresh(List<T> datas, int totalPage, int totalCount);
void loadMore(List<T> datas, int totalPage, int totalCount);
}
}
四.商品排序功能的实现(TabLayout)
1.TabLayout的使用(用到了design包)
①.xml文件
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/customTabLayout"
app:tabGravity="fill"
app:tabMode="fixed"
>
②.自定义属性
<style name="customTabLayout" parent="Widget.Design.TabLayout">
<!--<item name="tabMaxWidth">@dimen/tab_max_width</item>-->
<item name="tabIndicatorColor">#eb4f38</item>
<item name="tabIndicatorHeight">2dp</item>
<item name="tabPaddingStart">12dp</item>
<item name="tabPaddingEnd">12dp</item>
<item name="tabBackground">@color/white</item>
<item name="tabTextAppearance">@style/customTabTextAppearance</item>
<item name="tabSelectedTextColor">#eb4f38</item>
</style>
private void initTab() {
TabLayout.Tab tab = mTablayout.newTab();
tab.setText("默认");
tab.setTag(TAG_DEFAULT);
mTablayout.addTab(tab);
tab = mTablayout.newTab();
tab.setText("价格");
tab.setTag(TAG_PRICE);
mTablayout.addTab(tab);
tab = mTablayout.newTab();
tab.setText("销量");
tab.setTag(TAG_SALE);
mTablayout.addTab(tab);
mTablayout.setOnTabSelectedListener(this);
}
2.逻辑实现
/**
* Created by asus on 2016/10/27.
*/
public class WareListActivity extends AppCompatActivity implements Pager.OnPageListener, TabLayout.OnTabSelectedListener {
@ViewInject(R.id.tab_layout)//tablayout
private TabLayout mTablayout;
@ViewInject(R.id.txt_summary)//文字描述
private TextView mTxtSummary;
@ViewInject(R.id.recycler_view)//recycleView
private RecyclerView mRecyclerview_wares;
@ViewInject(R.id.refresh_layout)//刷新加载
private MaterialRefreshLayout mRefreshLayout;
@ViewInject(R.id.toolbar)//toolbar
private CnToolbar mToolbar;
public static final int TAG_DEFAULT = 0;
public static final int TAG_SALE = 1;
public static final int TAG_PRICE = 2;
public static final int ACTION_LIST=1;
public static final int ACTION_GIRD=2;
private long campaignId = 0;//id
private int orderBy = 0;//排序的
private SimpleAdapter simpleAdapter;
private Pager pager;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_warelist);
ViewUtils.inject(this);
campaignId = getIntent().getLongExtra(Contants.COMPAINGAIN_ID, 0);//点击homeFragment传入进来的id
initToolBar();
initTab();
getData();
}
private void getData() {
//1.设置参数
pager = Pager.newBuilder().setUrl(Contants.API.WARES_CAMPAIN_LIST)
.setRefreshLayout(mRefreshLayout)
.putParams("campaignId", campaignId)//放入的id
.putParams("orderBy", orderBy)//排序url里面的排序参数
.setLoadMore(true)
.setShowDialog(true)
.setPageSize(10)
.setOnPageListener(this)
.builder(this, new TypeToken<Page<Wares>>() {
}.getType());
pager.request();//2.加载数据
}
private void initToolBar() {
//左侧按钮的点击事件
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
mToolbar.setRightButtonIcon(getResources().getDrawable(R.drawable.icon_grid_32));
mToolbar.getmRightImageButton().setTag(ACTION_LIST);
//右侧按钮的点击事件
mToolbar.setmRightImageButtonOnclickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int action = (int) v.getTag();
if(action == ACTION_LIST ) {
mToolbar.getmRightImageButton().setTag(ACTION_GIRD);
mToolbar.setRightButtonIcon(getResources().getDrawable(R.drawable.icon_list_32));
mRecyclerview_wares.setLayoutManager(new GridLayoutManager(WareListActivity.this,2));
}else if(action==ACTION_GIRD){
mToolbar.getmRightImageButton().setTag(ACTION_LIST);
mToolbar.setRightButtonIcon(getResources().getDrawable(R.drawable.icon_grid_32));
mRecyclerview_wares.setLayoutManager(new LinearLayoutManager(WareListActivity.this));
}
}
});
}
private void initTab() {
TabLayout.Tab tab = mTablayout.newTab();
tab.setText("默认");
tab.setTag(TAG_DEFAULT);
mTablayout.addTab(tab);
tab = mTablayout.newTab();
tab.setText("价格");
tab.setTag(TAG_PRICE);
mTablayout.addTab(tab);
tab = mTablayout.newTab();
tab.setText("销量");
tab.setTag(TAG_SALE);
mTablayout.addTab(tab);
mTablayout.setOnTabSelectedListener(this);
}
@Override
public void load(List datas, int totalPage, int totalCount) {
Log.d("Ware", totalCount + "");
mTxtSummary.setText("共有" + totalCount + "件商品");
if (simpleAdapter == null) {
simpleAdapter = new SimpleAdapter(datas, this);
mRecyclerview_wares.setLayoutManager(new LinearLayoutManager(this));
mRecyclerview_wares.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
mRecyclerview_wares.setAdapter(simpleAdapter);
} else {
simpleAdapter.refreshData(datas);
}
}
@Override
public void refresh(List datas, int totalPage, int totalCount) {
simpleAdapter.refreshData(datas);
mRecyclerview_wares.scrollToPosition(0);
}
@Override
public void loadMore(List datas, int totalPage, int totalCount) {
simpleAdapter.loadMoreData(datas);
mRecyclerview_wares.scrollToPosition(simpleAdapter.getDatas().size());//位置停止在更多数据那
}
/*tab的监听事件变化*/
@Override
public void onTabSelected(TabLayout.Tab tab) {
orderBy = (int) tab.getTag();
pager.putParam("orderBy", orderBy);
pager.request();
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
}