android checkbox分页问题分析

本文深入探讨了在Android应用中,CheckBox组件在实现分页加载时遇到的问题及解决方案。通过对代码的详细分析,揭示了可能导致加载异常的原因,并提供了有效的优化策略。
摘要由CSDN通过智能技术生成

请看下面,代码中有注释:

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);




    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值