Search code examples
javaandroidcheckboxandroid-recyclerviewandroid-bottomsheetdialog

What's simple code/effective code to create CheckBox Programmatically in BottomSheetDialog when click every item in RecyclerView in Android (Java)


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


Solution

  • Finally I have simple code to create Checkbox Programmatically in BottomSheetDialog. So far I satisfied with this code.

    I got clues:

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