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
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.