Search code examples
androidcontextmenubaseadapter

How to make Context Menu for Grid View item with Base Adapter?


Problem:

I want to make video thumbnail shower with grid view.And at the right bottom corner there should be three dot button that opens context menu when pressed.

UPDATED getView()

Here is sample image from YouTube app :

 YouTube sample image https://i.sstatic.net/KC9j3.jpg

My Codes : (I don't think you will need code but anyway)

OnCreate()


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

        search_bar=findViewById(R.id.toolbar_search_slot);

        toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        MainActivity.this.setTitle(" ");
        getSupportActionBar().setDisplayHomeAsUpEnabled(false);
        getSupportActionBar().setDisplayShowHomeEnabled(false);
        getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_arrow_back_white_24dp);


        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                search_bar.setVisibility(View.GONE);

                getSupportActionBar().setDisplayHomeAsUpEnabled(false);
                getSupportActionBar().setHomeButtonEnabled(false);
            }
        });

checkpermission();

        videogridView=findViewById(R.id.video_grid_view);


        Thread thread =new GetAllMediaTasks();
        thread.start();







    }

My getView() method from BaseAdapter for GridView


public class VideoItemAdapter extends BaseAdapter {
    private static final String TAG = "VideoItemAdapter";
    private Context context;
    private ArrayList<Video> videolist;
    ViewHolder viewHolder;
    private  String videoname;
    private String  videopath;
    private long videoduration;
    private Bitmap video_thumbnail_bitmap;


    public VideoItemAdapter(Context context,ArrayList<Video> videolist)
    {
        this.context=context;
        this.videolist=videolist;
    }



       @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        videoname = videolist.get(position).getVideoname();
        videopath = videolist.get(position).getVideopath();
        videoduration = videolist.get(position).getDuration();
        video_thumbnail_bitmap=videolist.get(position).getThumbnail();


        Log.d(TAG, "getView: videopath : "+videopath);




        if (convertView == null) {
            final LayoutInflater layoutInflater = LayoutInflater.from(context);
            convertView = layoutInflater.inflate(R.layout.video_item, parent,false);

            final ImageView imageView= (ImageView)convertView.findViewById(R.id.video_item_bg);
            final TextView nameTextView = (TextView)convertView.findViewById(R.id.video_name_txt);
            final TextView videodurationTextView = (TextView)convertView.findViewById(R.id.video_duration_txt);
            final Button optionsmenubtn = convertView.findViewById(R.id.video_item_options_btn);
            final CardView cardView = convertView.findViewById(R.id.card_view_video_item);

            final ViewHolder viewHolder = new ViewHolder(nameTextView,videodurationTextView,imageView,optionsmenubtn,cardView);
            convertView.setTag(viewHolder);
            DisplayMetrics dm = new DisplayMetrics();
            ((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(dm);
            int size = dm.widthPixels / 3;
            convertView.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT, size));

        }



        viewHolder = (ViewHolder)convertView.getTag();
        viewHolder.videodurationTextView.setText(msToString(videoduration));
        viewHolder.nameTextView.setText(videoname);

        Log.d(TAG, "getView: video path  :"+videolist.get(position).getVideopath()+" position "+position);

       // Bitmap bitmap3 = ThumbnailUtils.createVideoThumbnail(videopath, MediaStore.Video.Thumbnails.MINI_KIND);
        setThumbNailtoView(video_thumbnail_bitmap);

        // new MakeVideoThumbnail().execute(videopath);

        CardView cardView =viewHolder.cardView;
        Button optionsbutton = viewHolder.optionsmenubtn;




        cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick: clicked position : "+position);
                Intent intent =new Intent(context,VideoPlayer.class);
                Bundle bundle =new Bundle();
                bundle.putString("VideoPath",videopath);
                intent.putExtras(bundle);
                context.startActivity(intent);
            }
        });


        optionsbutton.setOnClickListener(new View.OnClickListener() {  // Three dot  button
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "Clicked position : "+position, Toast.LENGTH_SHORT).show();
                v.setOnCreateContextMenuListener((Activity)context);

            }
        });

        //  viewHolder.cardView.setBackground(new BitmapDrawable(createThumbnailAtTime(videopath, 900)));

viewHolder.cardView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Log.d(TAG, "onClick: clicked position : "+position);
        Intent intent =new Intent(context,VideoPlayer.class);
        Bundle bundle =new Bundle();
        bundle.putString("VideoPath",videopath);
        intent.putExtras(bundle);
        context.startActivity(intent);
    }
});

   return convertView;

    }

    @Override
    public boolean onMenuItemClick(MenuItem item) {
        Toast.makeText(context, "Context Menu Clicked !", Toast.LENGTH_SHORT).show();
        return true;
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        menu.setHeaderTitle("Select Action");
        MenuItem doWhatever = menu.add(Menu.NONE, 1, 1, "Do whatever");
        doWhatever.setOnMenuItemClickListener(this);

    }
}

item.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="200dp"
    android:id="@+id/card_view_video_item"
    android:background="@color/colorPrimaryDark"
    >


        <ImageView
            android:id="@+id/video_item_bg"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="fitXY"
            />

        <RelativeLayout
            android:id="@+id/inside_cardview_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
android:background="@color/colorPrimaryDark"
            >


            <TextView
                android:id="@+id/video_duration_txt"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="00:00:00"
                android:textColor="#fff"
                android:textStyle="bold"
                android:layout_above="@+id/video_name_txt"
                />

            <TextView
                android:id="@+id/video_name_txt"
                android:layout_width="350dp"
                android:layout_height="wrap_content"
                android:text="Some Moovie Name"
                android:textColor="#fff"
                android:textSize="25sp"
                android:layout_alignParentBottom="true"
                android:textStyle="bold" />

            <Button
                android:id="@+id/video_item_options_btn"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:layout_marginTop="80dp"
                android:layout_alignParentEnd="true"
                android:layout_alignParentBottom="true"
                android:background="@drawable/ic_verthreedot_white_24dp"
                style="@style/Widget.AppCompat.Button.Borderless"
                 />




        </RelativeLayout>







</android.support.v7.widget.CardView>

LogCat

Logcat

Any help will be appreciated !


Solution

  • Place a three dot button inside your item_xml file then set OnClickListener to your button and on click of that button do this:

    Now create a menu xml file and set it as shown below and it should work pretty well.

     viewHolder.navigicon.setOnClickListener(new View.OnClickListener() {    
            @Override
            public void onClick(View v) {  
                PopupMenu popupMenu = new PopupMenu(mContext,v);
                popupMenu.inflate(R.menu.list_menu);
                popupMenu.show();
            }
        });