I have 100+ item in RecyclerView. these days I have tried to create simple code/effective code to create Checkbox in BottomSheetDialog Programmatically but no success.
My goal :
- Every item click in RecyclerView will show BottomSheetDialog with different amount checkbox. example :
when click item[0] in RecyclerView will open BottomSheetDialog with 7 checkboxes, if click item[1] in RecyclerView will open BottomSheetDialog with 286 checkboxes, or if click item [2] will open BottomSheetDialog with 200 checkboxes, and so on.
This image will describe, what I meant.
I think my goal is possible instead I create 100+ xml for every item in RecyclerView. Using for looping, array and other… if no simple/effective code for programmatically create checkbox, never mind I will create 100+ xml for every itemListener at RecyclerView
What I have tried :
I successed add single checkbox, but failed to add other checkbox. Here is my code :
Note : I commented for looping
because it didn’t work. Oke, thanks all 🙂
@Override public void onClick(View v) { int itemPosition = recyclerViewSurat.getChildLayoutPosition(v); String namaSurat = suratList.get(itemPosition).getNamaSurat(); // Toast.makeText(context, namaSurat, Toast.LENGTH_SHORT).show(); BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(context, R.style.BottomSheetDialogTheme); bottomSheetDialog.setContentView(R.layout.layout_bottom_sheet_ayat); ConstraintLayout constraintLayout = bottomSheetDialog.findViewById(R.id.constraintLayoutCheckBox); ConstraintSet constraintSet = new ConstraintSet(); ConstraintLayout.LayoutParams params = new ConstraintLayout.LayoutParams( ConstraintLayout.LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.WRAP_CONTENT ); int margin = (int) convertDpToPixel(30F, context); params.setMargins(margin,0,0,0); // for (int i = 0; i < 10; i++) { // AppCompatCheckBox compatCheckBox = new AppCompatCheckBox(context); // compatCheckBox.setId(i + 1); // compatCheckBox.setText("Ayat " + i); // compatCheckBox.setPadding(25, 0,0,0); // constraintLayout.addView(compatCheckBox, params); // // constraintSet.clone(constraintLayout); // constraintSet.connect(compatCheckBox.getId(), ConstraintSet.TOP, compatCheckBox.getId() + i, ConstraintSet.BOTTOM, 0); // constraintSet.applyTo(constraintLayout); // } AppCompatCheckBox compatCheckBox = new AppCompatCheckBox(context); compatCheckBox.setId(R.id.checkbox2); compatCheckBox.setText("Ayat 1"); compatCheckBox.setPadding(25, 0,0,0); constraintLayout.addView(compatCheckBox, params); constraintSet.clone(constraintLayout); constraintSet.connect(compatCheckBox.getId(), ConstraintSet.TOP, R.id.checkbox1, ConstraintSet.BOTTOM, 0); constraintSet.applyTo(constraintLayout); // constraintLayout.addView(checkBox); bottomSheetDialog.show(); } private float convertDpToPixel(float dp, Context context) { return dp * ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT); } }
Here my layout_bottom_sheet_ayat.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.appcompat.widget.LinearLayoutCompat xmlns:tools="http://schemas.android.com/tools" android:id="@+id/bottomSheetLinearLayout" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bottom_sheet_ayat" android:orientation="vertical" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" xmlns:app="http://schemas.android.com/apk/res-auto"> <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:padding="15dp" android:text="Pilih Ayat" android:textColor="@color/black" android:textSize="20sp" android:textStyle="bold"/> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginBottom="5dp" android:background="@color/white"/> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/constraintLayoutCheckBox" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <androidx.appcompat.widget.AppCompatCheckBox android:layout_width="wrap_content" android:layout_height="match_parent" android:id="@+id/checkbox1" android:layout_marginStart="15dp" android:layout_marginTop="24dp" android:padding="10dp" android:checked="false" android:enabled="true" android:text="Semua Ayat" app:layout_constraintStart_toStartOf="parent" android:layout_marginLeft="16dp" /> </androidx.constraintlayout.widget.ConstraintLayout> </androidx.appcompat.widget.LinearLayoutCompat>
Thanks very much for any sugesstion and help 🙂
Advertisement
Answer
Finally I have simple code to create Checkbox Programmatically in BottomSheetDialog. So far I satisfied with this code.
I got clues:
- Checkbox programmatically using LinearLayout from this tutorial on Youtube
- and Convert
dp
like inlayout_bottom_sheet_ayat.xml
programmatically using this Stackoverflow answer
So base on those clues, I made some changes on my code below :
private class MyOnClickListener implements View.OnClickListener { @Override public void onClick(View v) { int itemPosition = recyclerViewSurat.getChildLayoutPosition(v); String jumlahAyat = suratList.get(itemPosition).getJumlahAyat(); BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(context, R.style.BottomSheetDialogTheme); bottomSheetDialog.setContentView(R.layout.layout_bottom_sheet_ayat); LinearLayoutCompat linearLayoutCheckBox = bottomSheetDialog.findViewById(R.id.linearLayoutCheckBox); LinearLayoutCompat.LayoutParams params = new LinearLayoutCompat.LayoutParams( LinearLayoutCompat.LayoutParams.MATCH_PARENT, LinearLayoutCompat.LayoutParams.WRAP_CONTENT ); int margin = (int) convertDpToPixel(30F, context); params.setMargins(margin, 0,0,0); AppCompatCheckBox compatCheckBox; int banyakAyat = Integer.parseInt(jumlahAyat); for (int i = 1; i <= banyakAyat; i++) { compatCheckBox = new AppCompatCheckBox(context); compatCheckBox.setId(i); compatCheckBox.setText("Ayat " + i); int margin1 = (int) convertDpToPixel(10F, context); compatCheckBox.setPadding(margin1,0,0,0); linearLayoutCheckBox.addView(compatCheckBox, params); } bottomSheetDialog.show(); } private float convertDpToPixel(float dp, Context context) { return dp * ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT); } }
and my layout_bottom_sheet_ayat.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.appcompat.widget.LinearLayoutCompat xmlns:tools="http://schemas.android.com/tools" android:id="@+id/bottomSheetLinearLayout" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="550dp" android:background="@drawable/bottom_sheet_ayat" android:orientation="vertical" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" xmlns:app="http://schemas.android.com/apk/res-auto"> <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:padding="15dp" android:text="Pilih Ayat" android:textColor="@color/black" android:textSize="20sp" android:textStyle="bold"/> <View android:id="@+id/viewId" android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginBottom="5dp" android:background="@color/white"/> <androidx.core.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="wrap_content"> <androidx.appcompat.widget.LinearLayoutCompat android:id="@+id/linearLayoutCheckBox" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <androidx.appcompat.widget.AppCompatCheckBox android:layout_width="wrap_content" android:layout_height="match_parent" android:id="@+id/checkbox1" android:layout_marginTop="24dp" android:padding="10dp" android:checked="false" android:enabled="true" android:text="Semua Ayat" android:layout_marginLeft="15dp" android:layout_marginStart="15dp" /> </androidx.appcompat.widget.LinearLayoutCompat> </androidx.core.widget.NestedScrollView> </androidx.appcompat.widget.LinearLayoutCompat>
So thanks all 🙂