11
votes

I want to implement android bottom sheet in Onlongclick of my Recyclerview Adapter class, but am trying to press long click on my recyclerview item its got crashed.

     public class AddAtendanceAdapter extends      
        RecyclerView.Adapter<AddAtendanceAdapter.AttendanceViewHolder> {
        public List<Details> dAttendance = Collections.emptyList();

        private LayoutInflater inflater;
        private static Context context;

        private View v;




        public AddAtendanceAdapter(Context context, List<Details> dAttendance) {
            this.dAttendance = dAttendance;
            this.context = context;
            inflater = LayoutInflater.from(context);
        }

        @Override
        public AttendanceViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.student_item_row,
    parent, false);
            AttendanceViewHolder pvh = new AttendanceViewHolder(v);
            return pvh;
        }

        @Override
        public void onBindViewHolder(AttendanceViewHolder holder, int postions) {
            Details details = dAttendance.get(postions);
            holder.StudentsName.setText(details.getStudentName());
            Glide.with(context)
                    .load(details.getStudentImage())
                    .into(holder.stdImg);

        }

        @Override
        public int getItemCount() {
            if (dAttendance != null) {
                return dAttendance.size();
            }
            return 0;
        }


        @Override
        public void onAttachedToRecyclerView(RecyclerView recyclerView) {
            super.onAttachedToRecyclerView(recyclerView);
        }

        public static class AttendanceViewHolder extends RecyclerView.ViewHolder {



            TextView StudentsName;
            CircleImageView stdImg;
            private  Activity activity;
            AttendanceViewHolder(View itemView) {
                super(itemView);
                StudentsName = (TextView) itemView.findViewById(R.id.txtStdName);
                stdImg = (CircleImageView) itemView.findViewById(R.id.stdImg);
                itemView.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {
                        Log.d("juu","hhh");
                        openBottomSheet(v);

                        return false;
                    }
                });


            }
            private  void openBottomSheet(View v) {
           //View view = activity.getLayoutInflater ().inflate (R.layout.bottom_sheet, null);
               // View view = inflater.inflate( R.layout.bottom_sheet, null );

                LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
            View view = inflater.inflate (R.layout.bottom_sheet, null);
                TextView txtBackup = (TextView)view.findViewById(R.id.txt_backup);
                TextView txtDetail = (TextView)view.findViewById(R.id.txt_detail);
                TextView txtOpen = (TextView)view.findViewById(R.id.txt_open);
                final TextView txtUninstall = (TextView)view.findViewById( R.id.txt_uninstall);

                final Dialog mBottomSheetDialog = new Dialog (context, R.style.MaterialDialogSheet);
                mBottomSheetDialog.setContentView (view);
                mBottomSheetDialog.setCancelable (true);
                mBottomSheetDialog.getWindow ().setLayout (LinearLayout.LayoutParams.MATCH_PARENT,
    LinearLayout.LayoutParams.WRAP_CONTENT);
                mBottomSheetDialog.getWindow ().setGravity (Gravity.BOTTOM);
                mBottomSheetDialog.show ();


                txtBackup.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        Toast.makeText(context,"Clicked Backup",Toast.LENGTH_SHORT).show();
                        mBottomSheetDialog.dismiss();
                    }
                });

                txtDetail.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        Toast.makeText(context,"Clicked Detail",Toast.LENGTH_SHORT).show();
                        mBottomSheetDialog.dismiss();
                    }
                });

                txtOpen.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        Toast.makeText(context,"Clicked Open",Toast.LENGTH_SHORT).show();
                        mBottomSheetDialog.dismiss();
                    }
                });

                txtUninstall.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        Toast.makeText(context,"Clicked Uninstall",Toast.LENGTH_SHORT).show();
                        mBottomSheetDialog.dismiss();
                    }
                });
            }

        }

}

my log cat is

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application at android.view.ViewRootImpl.setView(ViewRootImpl.java:583) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:310) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85) at android.app.Dialog.show(Dialog.java:319) at in.edsys.teacherapp.adapters.AddAtendanceAdapter$AttendanceViewHolder.openBottomSheet(AddAtendanceAdapter.java:119) at in.edsys.teacherapp.adapters.AddAtendanceAdapter$AttendanceViewHolder.access$000(AddAtendanceAdapter.java:80) at in.edsys.teacherapp.adapters.AddAtendanceAdapter$AttendanceViewHolder$1.onLongClick(AddAtendanceAdapter.java:95)

2
provide your adapter onlong press code, it seems you are using bad window token, means you try to show something with context which is no longer exists.Silvans Solanki
can you give me sample code for that one?swaroop
Have a look at the following link of android developer blog spot, android-developers.blogspot.in/2016/02/…Silvans Solanki
You must try following link code. It works: github.com/Flipboard/bottomsheetMrunal
Actually its working in my mainactivity class,but its not working in the adapter class that my issue,i want open the bottomsheet when the user press long click on the recyclerview item.swaroop

2 Answers

15
votes

You can use Bottom Sheet Dialog Or Bottom Sheet Dialog Fragment For Display Bottom Sheet In Adapter Class

BottomSheetDialog Example

 View view = ((FragmentActivity)context).getLayoutInflater().inflate(R.layout.fragment_bottom_sheet, null);
                BottomSheetDialog dialog = new BottomSheetDialog(mContext);
                dialog.setContentView(view);
                dialog.show();

And Also You Can Use BottomsheetDialogFragment

BottomsheetDialogFragment Example

Dialog Class

public class BottomsheetDialog extends BottomSheetDialogFragment {

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup       container, @Nullable Bundle savedInstanceState) {
    View v=inflater.inflate(R.layout.fragment_bottom_sheet,container,false);
    return v;
}
}

Call BottomsheetDialog in your Adapter Class Like This

BottomSheetDialogFragment bottomSheetDialogFragment = new BottomsheetDialog();               
bottomSheetDialogFragment.show(((FragmentActivity)mContext).getSupportFragmentManager(), bottomSheetDialogFragment.getTag());

For More Information Check The Below Links

Link1

Link2

3
votes
private  void openBottomSheet(View v) {
                //View view = activity.getLayoutInflater ().inflate (R.layout.bottom_sheet, null);
                // View view = inflater.inflate( R.layout.bottom_sheet, null );
                Context context=v.getContext();
                LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
                View view = inflater.inflate (R.layout.bottom_sheet, null);
                TextView txtBackup = (TextView)view.findViewById(R.id.txt_backup);
                TextView txtDetail = (TextView)view.findViewById(R.id.txt_detail);
                TextView txtOpen = (TextView)view.findViewById(R.id.txt_open);
                final TextView txtUninstall = (TextView)view.findViewById( R.id.txt_backup);

            final Dialog mBottomSheetDialog = new Dialog (context, R.style.MaterialDialogSheet);
            mBottomSheetDialog.setContentView (view);
            mBottomSheetDialog.setCancelable (true);
            mBottomSheetDialog.getWindow ().setLayout (LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT);
            mBottomSheetDialog.getWindow ().setGravity (Gravity.BOTTOM);
            mBottomSheetDialog.show ();


            txtBackup.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                            Toast.makeText(v.getContext(),"Clicked Backup",Toast.LENGTH_SHORT).show();
                            mBottomSheetDialog.dismiss();
                    }
            });

            txtDetail.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                            Toast.makeText(v.getContext(),"Clicked Detail",Toast.LENGTH_SHORT).show();
                            mBottomSheetDialog.dismiss();
                    }
            });

            txtOpen.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                            Toast.makeText(v.getContext(),"Clicked Open",Toast.LENGTH_SHORT).show();
                            mBottomSheetDialog.dismiss();
                    }
            });

            txtUninstall.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                            Toast.makeText(v.getContext(),"Clicked Uninstall",Toast.LENGTH_SHORT).show();
                            mBottomSheetDialog.dismiss();
                    }
            });
    }

Use the code it worked for me making small changes to xml file