android - 如何使用基本适配器为网格视图项制作上下文菜单?
问题描述
问题:
我想用网格视图制作视频缩略图淋浴。在右下角应该有三个点按钮,按下时打开上下文菜单。
更新 getView()
这是来自 YouTube 应用的示例图片:
https://i.imgur.com/Uqvf6JD.jpg
我的代码:(我认为您不需要代码,但无论如何)
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();
}
我从 BaseAdapter 获取 GridView 的 getView() 方法
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);
}
}
项目.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>
日志猫
任何帮助将不胜感激 !
解决方案
在您的 item_xml 文件中放置一个三点按钮,然后将 OnClickListener 设置为您的按钮,然后单击该按钮执行以下操作:
现在创建一个菜单 xml 文件并将其设置如下所示,它应该可以正常工作。
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();
}
});
推荐阅读
- css - CSS 定位问题:希望表格定位到 TOP
- java - Java导入的流程是什么?
- amazon-web-services -
如何从外部脚本获取和使用返回值? - dialogflow-es-fulfillment - 我想将我使用 dialogflow 中的参数从客户那里得到的数据存储到谷歌表。那可能吗?
- python-3.x - Pandas DataFrame.plot 未正确设置 xlim 和 ylim
- java - javax.net.ssl.HttpsURLConnection 与 org.apache.http.client.HttpClient
- swift - 应用程序内语言更改不会反映 xcassets 直到我重新启动 iOS 应用程序 Swift
- php - 如何验证 id 存在于 laravel 中不同集合的 id 数组中
- python - 我的网络扫描python程序中没有显示windows vm的ip地址
- python-3.x - PyTorch 1.8.1 中神经网络的复杂数据