0

I have a parent recycler view with multiple items and two buttons for each view. If I click the button that I have highlighted, a dialog with another recycler view pops up which has checkboxes populated dynamically via api.

I have created an array list containing the data for the checkboxes in my parent recycler view so that the data populates uniquely for each individual row of the parent recycler view. My issue is that when I click the button and the dialog opens, after i check the items in one of the dialog, the remaining rows in the parent recycler view gets affected. thus, what i want to say is if i check the check boxes in any one dialog, all other dialog is checked. how do i solve it?

button that i click to open the dialog containing recycler view with checkboxes button that i click to open the dialog containing recycler view with checkboxes

this remains checked for every button that i click this remains checked for every button that i click

Array list my activity

public class DayPlannerActivity extends AppCompatActivity implements ListenerDayPlan {

    private Context context;
    
    ProgressDialog pdDialog;
    RecyclerView recyclerView;

    String URL = Constants.baseUrl;
   
    
    AdapterDayPlans adapterDayPlans;

    ArrayList<ModelSmName> modelSmNames;
    ArrayList<ModelSmActivity> modelSmActivities;
    ArrayList<ModelSmDayPlan> modelSmDayPlans;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_day_planner);

        context = getApplicationContext();

        modelSmNames = new ArrayList<>();
        modelSmActivities = new ArrayList<>();
        modelSmDayPlans = new ArrayList<>();

        initView();

        initDialog();

        preparePlans();
    }

    /**
     * init views
     */
    private void initView(){
        //RecyclerView
        recyclerView = findViewById(R.id.rv_dayPlanner);
    }

    /**
     * prepare loading dialog
     */
    private void initDialog(){
        //Creating dialog
        pdDialog= new ProgressDialog(DayPlannerActivity.this);
        pdDialog.setCancelable(false);
        pdDialog.setTitle("Getting your plans for the day...");
    }

    /**
     * start progress dialog
     */
    private void showLoader(){
        if(!pdDialog.isShowing()){
            pdDialog.show();
        }
    }

    /**
     * stop progress dialog
     */
    private void hideLoader(){
        if(pdDialog.isShowing()){
            pdDialog.dismiss();
        }
    }


    /**
     * request sm name list from server
     */
    private void getSmNameList(){
        final StringRequest stringRequest = new StringRequest(Request.Method.POST, URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        parseSmNameList(response);
//                        Log.d("TAG", "sm name list " + modelSmNames);
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                modelSmNames = null;
                hideLoader();
                //toast error
            }
        }) {
            @Override
            protected Map<String, String> getParams() {
                Map<String,String> params = new HashMap<>();
                params.put("req_type","get-am-wise-data");
                params.put("user_code", "75269");

                Log.d("deepLoginParams", "getParams: "+params);
                return params;
            }
        };
        RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
        requestQueue.add(stringRequest);
    }


    /**
     * parse sm name list received from server
     * @param response
     */
    private void parseSmNameList(String response){
        try{
            JSONArray jsonarray = new JSONArray(response);
            for (int j = 0; j<jsonarray.length();j++){
                JSONObject jsonObject = jsonarray.getJSONObject(j);
                ModelSmName modelSmName = new ModelSmName();

                modelSmName.setSmCode(jsonObject.getString("USER_CD"));
                modelSmName.setSmName(jsonObject.getString("USER_NAME"));

                modelSmNames.add(modelSmName);
            }
        } catch (Exception e) {
            e.printStackTrace();
            hideLoader();
            //toast error
        }
    }


    /**
     * request Activity list from server
     */
    private void getActivityList(){
        final StringRequest stringRequest = new StringRequest(Request.Method.POST, URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        parseActivityData(response);
//                        Log.d("TAG", "sm activity list " + modelSmActivities.toString());
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                modelSmActivities = null;
                hideLoader();
                //toast error
            }
        }) {
            @Override
            protected Map<String, String> getParams() {
                Map<String,String> params = new HashMap<>();
                params.put("req_type","get-dayplanner-activity-types");
                params.put("user_code", "75269");

                Log.d("deepLoginParams", "getParams: "+params);
                return params;
            }
        };
        RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
        requestQueue.add(stringRequest);
    }


    /**
     * parse activity data received from server
     * @param response
     */
    private void parseActivityData(String response){
        try{
            JSONArray jsonarray = new JSONArray(response);

            for (int j = 0; j<jsonarray.length();j++){
                JSONObject jsonObject = jsonarray.getJSONObject(j);
                ModelSmActivity smActivityModel = new ModelSmActivity();

                smActivityModel.setActivityCode(jsonObject.getString("activity_code"));
                smActivityModel.setActivityDescription(jsonObject.getString("activity_desc"));
                smActivityModel.setChecked(false); //set checked or not checking from server

                modelSmActivities.add(smActivityModel);
            }
        } catch (Exception e) {
            e.printStackTrace();
            hideLoader();
            //toast error
        }
    }


    /**
     * request plan data from server
     */
    public void getPlans(){
        final StringRequest stringRequest = new StringRequest(Request.Method.POST, URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
//                        Log.e("anyText",response);
                        try{
                            parseDayPlanData(response);

                            initDayPlanRecycler(modelSmDayPlans);
                        } catch (Exception e) {
                            e.printStackTrace();
                            hideLoader();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                hideLoader();
            }
        }) {
            @Override
            protected Map<String, String> getParams() {
                Map<String,String> params = new HashMap<>();
                params.put("req_type","get-plan-data");
                params.put("yr_month_cd", "May");

                Log.d("deepLoginParams", "getParams: "+params);
                return params;
            }
        };
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);
    }

    /**
     * parse day plans received from server
     * @param response
     */
    private void parseDayPlanData(String response){
        try {
            JSONObject jsonObject1 = new JSONObject(response);

            Iterator<?> keys = jsonObject1.keys();
            while(keys.hasNext()) {
                String key = (String) keys.next();
                JSONArray jsonarray = jsonObject1.getJSONArray(key);

                for (int j = 0; j<jsonarray.length();j++){
                    ModelSmDayPlan modelSmDayPlan = new ModelSmDayPlan();

                    JSONObject jsonObject = jsonarray.getJSONObject(j);

                    modelSmDayPlan.setPlanId(jsonObject.getString("PLAN_ID"));
                    modelSmDayPlan.setPlanDate(jsonObject.getString("PLAN_DT"));
                    modelSmDayPlan.setSmWorkPlanCode(jsonObject.getString("SWPT_CD"));
                    modelSmDayPlan.setSmCode(jsonObject.getString("SM_CD"));
                    modelSmDayPlan.setSmWorkPlanName(jsonObject.getString("SWPT_NAME"));

                    if(jsonObject.getString("SM_NAME").equals("0")){
                        modelSmDayPlan.setSmName("NA");
                    } else {
                        modelSmDayPlan.setSmName(jsonObject.getString("SM_NAME"));
                    }

                    if(jsonObject.getString("ACTIVITY_TYPES").equals("0")){
                        modelSmDayPlan.setSmActivity("NA");
                    } else {
                        modelSmDayPlan.setSmActivity(jsonObject.getString("ACTIVITY_TYPES"));
                    }

                    modelSmDayPlan.setModelSmActivities(modelSmActivities);

                    modelSmDayPlans.add(modelSmDayPlan);
                }
            }
        } catch (Exception e){
            modelSmDayPlans = null;
            e.printStackTrace();
            hideLoader();
        }
    }

    /**
     * prepare name, activity, plan lists
     */
    private void preparePlans(){
        showLoader();

        getSmNameList(); //get sm name list

        getActivityList();  //get activity list

        getPlans(); //get plan list

        hideLoader();
    }

    /**
     * init day planner recycler
     * @param dayPlanArrayList
     */
    private void initDayPlanRecycler(ArrayList<ModelSmDayPlan> dayPlanArrayList){
        if(dayPlanArrayList != null){
            recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(),
                    LinearLayoutManager.VERTICAL,false));

            adapterDayPlans = new AdapterDayPlans(context, dayPlanArrayList, modelSmNames, modelSmActivities,this,
                    DayPlannerActivity.this);
            recyclerView.setAdapter(adapterDayPlans);
        } else {
            Toast.makeText(context, "Day plans not found. Please retry", Toast.LENGTH_SHORT).show();
        }
    }


    @Override
    public void onStart() {

        super.onStart();
//        getPlans();

    }

    @Override
    protected void onResume() {
        super.onResume();
//        getPlans();

    }

    @Override
    public void onPause() {

        super.onPause();
//        getPlans();

    }

    @Override
    public void onStop() {
        super.onStop();

    }

//    @Override
//    public void AddData(int childPosition, int parentPosition) {
//        String smName = smNameList.get(childPosition).getSmUserName();
//
//        dayPlannerModelArrayList.get(parentPosition).setSmUserName(smName);
//
//        dayPlannerActivitySelectAdapter.notifyDataSetChanged();
//    }

//    @Override
//    public void SaveData( int parentPosition, ArrayList<DayPlannerModel> updatedActivityList) {

        //update the previous activity list
//        dayPlannerModelArrayList.get(parentPosition).setIndividualActivityList(updatedActivityList);
//
//        dayPlannerActivitySelectAdapter.notifyDataSetChanged();
//    }


    /**
     * on plans name list clicked
     * @params int namePosition, int cardPosition
     */
    @Override
    public void onNameListClicked(int namePosition, int planPosition) {
        String smName = modelSmNames.get(namePosition).getSmName();

        modelSmDayPlans.get(planPosition).setSmName(smName);

        adapterDayPlans.notifyDataSetChanged();
    }

    /**
     * on activity list clicked
     * @param position
     */
    @Override
    public void onActivityClicked(int position) {

    }
}

Adapter for Day Planner Activity

public class AdapterDayPlans extends RecyclerView.Adapter<AdapterDayPlans.DayPlannerViewHolder>
        implements ListenerDismiss {

    private Context context;
    private ListenerDayPlan listenerDayPlan;
    private ArrayList<ModelSmDayPlan> modelSmDayPlans;
    private ArrayList<ModelSmName> modelSmNames;
    private ArrayList<ModelSmActivity> modelSmActivities;

    public AlertDialog dialog;
    private Activity activity;

    public AdapterDayPlans(Context context, ArrayList<ModelSmDayPlan> modelSmDayPlans,
                           ArrayList<ModelSmName> modelSmNames, ArrayList<ModelSmActivity> modelSmActivities,
                           ListenerDayPlan listenerDayPlan,
                           Activity activity) {
        this.context = context;
        this.modelSmDayPlans = modelSmDayPlans;
        this.listenerDayPlan = listenerDayPlan;
        this.modelSmNames = modelSmNames;
        this.modelSmActivities = modelSmActivities;
        this.activity = activity;
    }

    @NonNull
    @Override
    public AdapterDayPlans.DayPlannerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.day_planner_recycler_content, parent, false);
        return new AdapterDayPlans.DayPlannerViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull AdapterDayPlans.DayPlannerViewHolder holder, int position) {
        holder.date.setText(modelSmDayPlans.get(position).getPlanDate());
        holder.time.setText(modelSmDayPlans.get(position).getSmWorkPlanName());

        holder.tv_data.setText(modelSmDayPlans.get(position).getSmName());
        holder.tv_activity.setText(modelSmDayPlans.get(position).getSmActivity());

        holder.selectSm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showSmDataList(holder.getAdapterPosition());
            }
        });

        holder.selectActivity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("TAG", "plan position " + holder.getAdapterPosition());
                showActivityList(holder.getAdapterPosition());
            }
        });
    }

    @Override
    public int getItemCount() {
        return modelSmDayPlans.size();
    }

    @Override
    public void onDismiss() {
        if(dialog.isShowing()){
            dialog.dismiss();
        }
    }

    public class DayPlannerViewHolder extends RecyclerView.ViewHolder{

        TextView date, time, selectSm, selectActivity, tv_data, tv_activity;

        public DayPlannerViewHolder(@NonNull View itemView) {
            super(itemView);

            date = itemView.findViewById(R.id.tv_date);
            time = itemView.findViewById(R.id.tv_time);
            tv_data = itemView.findViewById(R.id.tv_userData);
            tv_activity = itemView.findViewById(R.id.tv_activityTypeData);
            selectSm = itemView.findViewById(R.id.tv_chooseSm);
            selectActivity = itemView.findViewById(R.id.tv_activityType);
        }
    }

    private void showSmDataList(int planPosition){
        if(modelSmNames != null){
            if(modelSmNames.size() > 0){

                AlertDialog.Builder builder = new AlertDialog.Builder(activity);
                View customLayout = LayoutInflater.from(context).inflate(R.layout.user_data_dayplanner,null);
                builder.setView(customLayout);

                RecyclerView userDataRecycler = customLayout.findViewById(R.id.userDataDayPlan);
                userDataRecycler.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL,false));
                AdapterSmName adapterSmName =
                        new AdapterSmName(context, planPosition, modelSmNames, listenerDayPlan, this);
                userDataRecycler.setAdapter(adapterSmName);
                dialog = builder.create();
                dialog.show();

            } else {
                //handle error
            }
        } else {
            //handle error
        }
    }

    private void showActivityList(int planPosition){
        if(modelSmDayPlans.get(planPosition).getModelSmActivities() != null){
            if(modelSmDayPlans.get(planPosition).getModelSmActivities().size() > 0){
                AlertDialog.Builder builder2 = new AlertDialog.Builder(activity);
                View customLayout = LayoutInflater.from(context).inflate(R.layout.user_data_dayplanner,null);
                builder2.setView(customLayout);

                RecyclerView userDataRecycler = customLayout.findViewById(R.id.userDataDayPlan);
                userDataRecycler.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL,false));
                Log.d("KKP", "planPosition " + planPosition);

                AdapterSmActivity adapterSmActivity =
                        new AdapterSmActivity(context,modelSmDayPlans, modelSmActivities);

//                AdapterSmActivity adapterSmActivity =
//                        new AdapterSmActivity(context, modelSmDayPlans, planPosition);
//                Log.d("TAG", "activity list " + modelSmDayPlans.get(planPosition).getModelSmActivities().toString());
//                Log.d("TAG", "activity list " + modelSmDayPlans.get(planPosition).getModelSmActivities().toString());
                Log.d("TAG", "activity list " + modelSmDayPlans.toString());
                userDataRecycler.setAdapter(adapterSmActivity);

                dialog = builder2.create();
                dialog.show();
            } else {
                //handle error
            }
        } else {
            //handle error
        }
    }
}

Adapter for dialog containing recycler view

        public class AdapterSmActivity extends RecyclerView.Adapter<AdapterSmActivity.SmActivityViewHolder> {

    private Context context;
    private ArrayList<ModelSmActivity> modelSmActivities;
    private ArrayList<ModelSmDayPlan> modelSmDayPlans;
    ArrayList<String> lstChk = new ArrayList<>();


    public AdapterSmActivity(Context context, ArrayList<ModelSmDayPlan> modelSmDayPlans, ArrayList<ModelSmActivity> modelSmActivities){
        this.context = context;
        this.modelSmActivities = modelSmActivities;
        this.modelSmDayPlans = modelSmDayPlans;
//        this.modelSmActivitiesTemporary = modelSmActivities;
    }

//    public AdapterSmActivity(Context context, ArrayList<ModelSmDayPlan> modelSmDayPlans) {
//        this.context = context;
//        this.modelSmDayPlans = modelSmDayPlans;
//
//    }

    @Override
    public AdapterSmActivity.SmActivityViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.activity_data_day_plan, parent, false);
        return new AdapterSmActivity.SmActivityViewHolder(view);
    }

    public void onBindViewHolder(AdapterSmActivity.SmActivityViewHolder holder, int position) {
        holder.checkBox.setText(modelSmActivities.get(position).getActivityDescription());

        Log.d("KKP", "onBindViewHolder: "+position);
        if(position == modelSmActivities.size() - 1){
            holder.btnSave.setVisibility(View.VISIBLE);
        }

        holder.checkBox.setChecked(modelSmActivities.get(holder.getAdapterPosition()).isChecked());
        holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

//                modelSmActivities.get(holder.getAdapterPosition()).setChecked(isChecked);
//                modelSmActivities.get(holder.getAdapterPosition()).setChecked(isChecked);

                modelSmDayPlans.get(holder.getAdapterPosition()).getModelSmActivities().get(holder.getAdapterPosition()).setChecked(isChecked);

            }
        });
//        if(lstChk.contains(modelSmActivities.get(position).getActivityDescription()))
//        {
//            holder.checkBox.setChecked(true);
//        }

//        holder.checkBox.setChecked(false);
//        holder.checkBox.setOnCheckedChangeListener(null);



//        holder.itemView.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                if(holder.checkBox.isChecked())
//                {
//                    holder.checkBox.setChecked(true);
//                    lstChk.add(modelSmActivities.get(holder.getAdapterPosition()).getActivityDescription());
//                }
//                else
//                {
//                    holder.checkBox.setChecked(false);
//                    lstChk.remove(modelSmActivities.get(holder.getAdapterPosition()).getActivityDescription());
//
//                }
//            }
//        });




        holder.btnSave.setOnClickListener(click -> {
//            userDataDayPlannerListener.onUserActivitySave(parentPosition);
        });
    }

    @Override
    public int getItemCount() {
        return modelSmActivities.size();
    }

//    @Override
//    public void onUserDataClicked() {
//        dialog.dismiss();
//    }

//    @Override
//    public void onUserActivityClicked(int parentPosition, int childPosition, boolean isChecked) {
//        dayPlannerModelArrayList.get(parentPosition).getIndividualActivityList().get(childPosition).setChecked(isChecked);
////        Log.d("TAG", "list " + ActivityList.toString());
//    }

//    @Override
//    public void onUserActivitySave(int parentPosition) {
//        //on save
//
//        //send the child array list back to activity
//        sendData.SaveData(parentPosition, dayPlannerModelArrayList.get(parentPosition).getIndividualActivityList());
//        dialog.dismiss();
//    }


    public class SmActivityViewHolder extends RecyclerView.ViewHolder{
        private CheckBox checkBox;
        private Button btnSave;

        public SmActivityViewHolder(View itemView) {
            super(itemView);

            checkBox = itemView.findViewById(R.id.cb_Checkbox);
            btnSave = itemView.findViewById(R.id.btn_save);
        }

    }



}

I have created an array list containing the data for the checkboxes in my parent recycler view so that the data populates uniquely for each individual row of the parent recycler view, even though each row dialog recycler view is populating uniquely, the checkbox still checks every row.

0 Answers0