请看下面,代码中有注释:
package org.fdcch.iotclient.view.adpter;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
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.LinearLayout;
import android.widget.TextView;
import com.huangxudong.threadpool.HttpQuery;
import com.huangxudong.threadpool.ThreadPool;
import com.qmuiteam.qmui.widget.dialog.QMUIDialog;
import com.qmuiteam.qmui.widget.dialog.QMUIDialogAction;
import com.squareup.picasso.Picasso;
import org.fdcch.iotclient.BuildConfig;
import org.fdcch.iotclient.R;
import org.fdcch.iotclient.model.Constant;
import org.fdcch.iotclient.view.activity.LoginActivity;
import org.fdcch.iotclient.view.activity.MyApplication;
import org.fdcch.iotclient.view.activity.ReserveActivity;
import org.fdcch.iotclient.view.fragment.ShoppingBasketFragment;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 菜篮子适配器.
* <p>主要是用来对列表数据进行绑定</p>
* @author Mr Huang 2018/5/2
* @version 1.0
* @see RecyclerView.Adapter
* @see RecyclerView.ViewHolder
* @see DynamicStateAdpter
*/
public class ShoppingBasketAdpter extends RecyclerView.Adapter<ShoppingBasketAdpter.ViewHolder> {
private Context mContext;
private List<Map<String,Object>>mList;
private int uniqueCode=0;
private String userId;
private int shopNum=0,shopMax=1000;
private CallBackBasket mCallBackBasket;
public ShoppingBasketAdpter(Context context, List<Map<String, Object>> list,int uniqueCode,CallBackBasket callBackBasket,String userIds) {
mContext = context;
mList = list;
this.uniqueCode=uniqueCode;
mCallBackBasket=callBackBasket;
userId=userIds;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view= LayoutInflater.from(mContext).inflate(R.layout.item_shopping_basket,parent,false);
return new ViewHolder(view);
}
public void showMessage(String mgs, String title, final int code){
if (mContext==null){
return;
}
new QMUIDialog.MessageDialogBuilder(mContext)
.setTitle(title)
.setMessage(mgs)
.addAction("确定",new QMUIDialogAction.ActionListener(){
@Override
public void onClick(QMUIDialog dialog, int index) {
dialog.dismiss();
}
})
.setCancelable(false)
.show();
};
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
if (mList.get(position).get("img")!=null&&!mList.get(position).get("img").equals("")&&((List<String>)mList.get(position).get("img")).size()>0&&((List<String>)mList.get(position).get("img")).get(0)!=null&&!((List<String>)mList.get(position).get("img")).get(0).equals("")){
Picasso.with(mContext).load(((List<String>)mList.get(position).get("img")).get(0)).error(R.drawable.caihead).into(holder.mImageView);
}else {
Picasso.with(mContext).load(R.drawable.caihead).into(holder.mImageView);
}
if ((Boolean) mList.get(position).get("ischecked")){
holder.mCheckBoxBasketOne.setChecked(true);
}else {
holder.mCheckBoxBasketOne.setChecked(false);
}
String orderType=mList.get(position).get("ordertype")+"";
if (orderType.equals("1")){
holder.mTextViewOrderType.setBackgroundColor(ContextCompat.getColor(mContext,R.color.ptorder));
orderType="普通";
}else if (orderType.equals("2")){
holder.mTextViewOrderType.setBackgroundColor(ContextCompat.getColor(mContext,R.color.ydorder));
orderType="预订";
}else if (orderType.equals("3")){
holder.mTextViewOrderType.setBackgroundColor(ContextCompat.getColor(mContext,R.color.ysorder));
orderType="预售";
}
holder.mCheckBoxBasketOne.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
/***
* 还是要分页,这里还是进行操作了,最开始和最后操作都是一样的,都是在改引用的原始地址,分页直接重新new这个类
*
*/
if (isChecked){
Map<String,Object>map1=mList.get(position);
map1.put("ischecked",true);
if (mCallBackBasket!=null){
if (uniqueCode==ReserveActivity.UNIQUE_CODE){
mCallBackBasket.callBackOrderState(map1);
return;
}
mCallBackBasket.callBackPrice(Double.parseDouble(holder.mTextViewBasketPrice.getText().toString().trim()));
Map<String,Object>map11=new HashMap<>();
map11.put("id",mList.get(position).get("id"));
map11.put("did",mList.get(position).get("did"));
map11.put("type",mList.get(position).get("ordertype")+"");
if (shopNum==0){
map11.put("count",mList.get(position).get("count"));
}else {
map11.put("count",shopNum);
}
mCallBackBasket.callBackOrderState(map11);
}
}else {
Map<String,Object>map1=mList.get(position);
map1.put("ischecked",false);
if (mCallBackBasket!=null){
if (uniqueCode==ReserveActivity.UNIQUE_CODE){
mCallBackBasket.removeOrderState(map1);
return;
}
mCallBackBasket.callBackPrice(-Double.parseDouble(holder.mTextViewBasketPrice.getText().toString().trim()));
mCallBackBasket.callBackRemoveOrderState(mList.get(position).get("id")+"");
}
}
}
});
if (uniqueCode== ShoppingBasketFragment.UNIQUE_CODE){
holder.mLinearLayout.setVisibility(View.GONE);
holder.mTextViewBasketDate.setVisibility(View.GONE);
holder.mTextViewBasketName.setText(mList.get(position).get("name")+"");
holder.mTextViewBasketContent.setText(mList.get(position).get("content")+"");
holder.mTextViewBasketPrice.setText(Double.parseDouble(mList.get(position).get("price")+"")*((int)mList.get(position).get("count"))+"");
holder.mTextViewBasketNum.setText(mList.get(position).get("number")+"");
holder.mTextViewShopNum.setText(mList.get(position).get("count")+"");
holder.mTextViewOrderType.setText(orderType);
}else if (uniqueCode== ReserveActivity.UNIQUE_CODE){
holder.mLinearLayout.setVisibility(View.VISIBLE);
holder.mTextViewBasketDate.setVisibility(View.VISIBLE);
holder.mTextViewBasketName.setText(mList.get(position).get("name")+"");
holder.mTextViewBasketContent.setText(mList.get(position).get("content")+"");
holder.mTextViewBasketPrice.setText(Double.parseDouble(mList.get(position).get("price")+"")*((int)mList.get(position).get("count"))+"");
holder.mTextViewBasketNum.setText(mList.get(position).get("number")+"");
holder.mTextViewBasketDate.setText(mList.get(position).get("date")+"");
holder.mTextViewShopNum.setText(mList.get(position).get("count")+"");
holder.mTextViewOrderType.setText(orderType);
}
holder.mImageViewAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
shopNum=Integer.parseInt(holder.mTextViewShopNum.getText().toString());
++shopNum;
if (!holder.mImageViewJian.isEnabled()){
holder.mImageViewJian.setEnabled(true);
holder.mImageViewJian.setImageDrawable(ContextCompat.getDrawable(mContext,R.drawable.ic_action_jiana));
}
if (shopNum>shopMax){
holder.mImageViewAdd.setEnabled(false);
holder.mImageViewAdd.setImageDrawable(ContextCompat.getDrawable(mContext,R.drawable.ic_action_jia));
}else {
mViewHolder=holder;
code=position;
if (uniqueCode==ReserveActivity.UNIQUE_CODE){
String state=mList.get(position).get("state")+"";
int states=Integer.parseInt(state);
if (states>=3){
showMessage("配送中,数量无法修改!","提示信息",1);
}else {
Map<String,String>map=new HashMap<>();
map.put("modelId",mList.get(position).get("id").toString());
map.put("amount",shopNum+"");
map.put("roleId",((MyApplication)((AppCompatActivity)mContext).getApplication()).getRoleId());
map.put("orderNum",mList.get(position).get("orderNum")+"");
adda(map);
}
}else {
String state=mList.get(position).get("state")+"";
int states=Integer.parseInt(state!=null&&!state.equals("null")?state:"0");
if (states>=3){
showMessage("配送中,数量无法修改!","提示信息",1);
}else {
Map<String,String>map=new HashMap<>();
map.put("itemId",mList.get(position).get("id").toString());
map.put("itemAmount",shopNum+"");
map.put("userId",userId);
add(map);
}
}
}
}
});
holder.mImageViewJian.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
shopNum=Integer.parseInt(holder.mTextViewShopNum.getText().toString());
--shopNum;
if (!holder.mImageViewAdd.isEnabled()){
holder.mImageViewAdd.setEnabled(true);
holder.mImageViewAdd.setImageDrawable(ContextCompat.getDrawable(mContext,R.drawable.ic_action_jiaa));
}
if (shopNum<1){
holder.mImageViewJian.setEnabled(false);
holder.mImageViewJian.setImageDrawable(ContextCompat.getDrawable(mContext,R.drawable.ic_action_jian));
}else {
mViewHolder=holder;
code=position;
if (uniqueCode==ReserveActivity.UNIQUE_CODE){
Map<String,String>map=new HashMap<>();
map.put("modelId",mList.get(position).get("id").toString());
map.put("amount",shopNum+"");
map.put("roleId",((MyApplication)((AppCompatActivity)mContext).getApplication()).getRoleId());
map.put("orderNum",mList.get(position).get("orderNum")+"");
subTracta(map);
}else {
Map<String,String>map=new HashMap<>();
map.put("itemId",mList.get(position).get("id").toString());
map.put("itemAmount",shopNum+"");
map.put("userId",userId);
subTract(map);
}
}
}
});
}
private Handler mHandler=new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
switch (msg.what){
case Constant.AddGardenFragmentHandleAdd:
if (msg.obj==null){
--shopNum;
return false;
}
try {
JSONObject jsonObject=new JSONObject(msg.obj.toString());
int statusCode=jsonObject.getInt("statusCode");
if (statusCode==200){
mViewHolder.mTextViewShopNum.setText(shopNum+"");
mViewHolder.mTextViewBasketPrice.setText((double)mList.get(code).get("price")*shopNum+"");
}else {
--shopNum;
}
} catch (JSONException e) {
--shopNum;
}
break;
case Constant.AddGardenFragmentHandleSubTract:
if (msg.obj==null){
++shopNum;
return false;
}
try {
JSONObject jsonObject=new JSONObject(msg.obj.toString());
int statusCode=jsonObject.getInt("statusCode");
if (statusCode==200){
mViewHolder.mTextViewShopNum.setText(shopNum+"");
mViewHolder.mTextViewBasketPrice.setText((double)mList.get(code).get("price")*shopNum+"");
}else {
++shopNum;
}
} catch (JSONException e) {
++shopNum;
}
break;
}
return false;
}
});
private ViewHolder mViewHolder;
private int code=0;
private List<Runnable>mRunnables=new ArrayList<>();
public void add(final Map<String,String>map){
int runSize=mRunnables.size();
mRunnables.add(new Runnable() {
@Override
public void run() {
HttpQuery.getInstance().doGet(BuildConfig.UPLOADBASKET,map, Constant.AddGardenFragmentHandleAdd,mHandler);
}
});
ThreadPool.query(LoginActivity.class).queryExecutor(runSize,mRunnables);
}
public void subTract(final Map<String,String>map){
int runSize=mRunnables.size();
mRunnables.add(new Runnable() {
@Override
public void run() {
HttpQuery.getInstance().doGet(BuildConfig.UPLOADBASKET,map, Constant.AddGardenFragmentHandleSubTract,mHandler);
}
});
ThreadPool.query(LoginActivity.class).queryExecutor(runSize,mRunnables);
}
public void adda(final Map<String,String>map){
int runSize=mRunnables.size();
mRunnables.add(new Runnable() {
@Override
public void run() {
HttpQuery.getInstance().doGet(BuildConfig.CHANGENUMBER,map, Constant.AddGardenFragmentHandleAdd,mHandler);
}
});
ThreadPool.query(LoginActivity.class).queryExecutor(runSize,mRunnables);
}
public void subTracta(final Map<String,String>map){
int runSize=mRunnables.size();
mRunnables.add(new Runnable() {
@Override
public void run() {
HttpQuery.getInstance().doGet(BuildConfig.CHANGENUMBER,map, Constant.AddGardenFragmentHandleSubTract,mHandler);
}
});
ThreadPool.query(LoginActivity.class).queryExecutor(runSize,mRunnables);
}
@Override
public int getItemCount() {
if (mList!=null){
return mList.size();
}
return 0;
}
public class ViewHolder extends RecyclerView.ViewHolder{
/**
* 这里当滑到屏幕显示的最大值的时候,postion就变成0了,说明白点就是Checkbox被引用了,控件被引用了
*
* 在这里如果用控件复用来改变状态的话,会出问题的,可以这样看,数据1万条没错,内存16m或者够大,这1万条
*
* list数据可以存下来,但是CheackBox就不一样了,人家listview只人屏幕,屏幕最大能显示多少条数据,多了
*
* 就把第一页的控件引用一遍,重新创建了一个checkbox,这里的checkbox=BeforCcheckbox,如果用map集合将每个数据的名称当key,checkbox当值
*
* 数据没问题,但是控件就有问题了,改变了根地址的内存,所有的引用就跟着改了,这个注释百度上没找到,是个人理解的
*
* 所以这里准备用单纯的数据改变ui,不存在复用控件进行改变checkbox状态
*
*/
private CheckBox mCheckBoxBasketOne;
private ImageView mImageView,mImageViewJian,mImageViewAdd;
private LinearLayout mLinearLayout;
private TextView mTextViewBasketName,mTextViewBasketDate,mTextViewBasketContent,mTextViewBasketPrice,mTextViewBasketNum,mTextViewShopNum,mTextViewOrderType;
public ViewHolder(View itemView) {
super(itemView);
mCheckBoxBasketOne=itemView.findViewById(R.id.cb_one);
mImageView=itemView.findViewById(R.id.iv_basket_show);
mTextViewBasketName=itemView.findViewById(R.id.tv_basket_name);
mTextViewBasketContent=itemView.findViewById(R.id.tv_basket_content);
mTextViewBasketPrice=itemView.findViewById(R.id.tv_basket_price);
mTextViewBasketNum=itemView.findViewById(R.id.tv_basket_num);
mTextViewBasketDate=itemView.findViewById(R.id.tv_basket_date);
mLinearLayout=itemView.findViewById(R.id.ll_basket_date);
mImageViewJian=itemView.findViewById(R.id.iv_basket_jian);
mImageViewAdd=itemView.findViewById(R.id.iv_basket_add);
mTextViewShopNum=itemView.findViewById(R.id.tv_basket_shopnum);
mTextViewOrderType=itemView.findViewById(R.id.tv_basket_type);
}
}
public interface CallBackBasket{
void callBackPrice(double i);
void callBackOrderState(Map<String,Object>map);
void removeOrderState(Map<String,Object>map);
void callBackRemoveOrderState(String id);
}
}