Android 如何在firebaseui提供的recyclerview项上使用上下文菜单
我想知道如何在FirebaseUI提供的recyclerview项中放置contextmenu,并能够在知道长按哪个项的情况下执行一些操作。因为当我尝试在holder类上使用onCreateContextMenu时,ContextMenuInfo带有空值。 这是我的课程:Android 如何在firebaseui提供的recyclerview项上使用上下文菜单,android,android-recyclerview,navigation-drawer,firebaseui,android-contextmenu,Android,Android Recyclerview,Navigation Drawer,Firebaseui,Android Contextmenu,我想知道如何在FirebaseUI提供的recyclerview项中放置contextmenu,并能够在知道长按哪个项的情况下执行一些操作。因为当我尝试在holder类上使用onCreateContextMenu时,ContextMenuInfo带有空值。 这是我的课程: public class PlayerHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener { //pri
public class PlayerHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener {
//private static final String TAG = PlayerHolder.class.getSimpleName();
public TextView playerName;
public TextView playerAge;
public PlayerHolder(View itemView) {
super(itemView);
playerName = (TextView) itemView.findViewById(R.id.player_name);
playerAge = (TextView) itemView.findViewById(R.id.player_age);
itemView.setOnCreateContextMenuListener(this);
}
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
menu.add(0, 1, 0, "Edit");//groupId, itemId, order, title
menu.add(0, 2, 0, "Share");
menu.add(0, 3, 0, "Delete");
}
//@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView .AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case 1:
//editNote(info.id);
return true;
case 2:
//shareNote(info.id);
return true;
case 3:
//deleteNote(info.id);
return true;
default:
//return super.onContextItemSelected(item);
return false;
}
}
}
这是我的firebaseui回收器适配器类
public class PlayerAdapter extends FirebaseRecyclerAdapter<Player, PlayerHolder> {
private static final String TAG = PlayerAdapter.class.getSimpleName();
private Context context;
public PlayerAdapter(Class<Player> modelClass, int modelLayout, Class<PlayerHolder> viewHolderClass, DatabaseReference ref, Context context) {
super(modelClass, modelLayout, viewHolderClass, ref);
this.context = context;
}
@Override
protected void populateViewHolder(PlayerHolder viewHolder, Player model, int position) {
viewHolder.playerName.setText(model.getName());
viewHolder.playerAge.setText(String.valueOf(playerAge) + " Years");
}
}
公共类PlayerAdapter扩展了FirebaseRecyclerAdapter{
私有静态最终字符串标记=PlayerAdapter.class.getSimpleName();
私人语境;
公共播放器适配器(类modelClass、int modelLayout、类viewHolderClass、数据库引用、上下文){
超级(modelClass、modelLayout、viewHolderClass、ref);
this.context=上下文;
}
@凌驾
受保护的void populateViewHolder(播放者文件夹viewHolder,播放器型号,int位置){
viewHolder.playerName.setText(model.getName());
viewHolder.playerAge.setText(String.valueOf(playerAge)+“年”);
}
}
我通过在本文中使用此解决方案解决了此问题:
这是我的密码:
MessageViewHolder类别:
public static class MessageViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener {
public TextView tvMessage;
public TextView tvDateSending;
public CircleImageView ivMessenger;
public LinearLayout linearLayout;
public MessageViewHolder(View v) {
super(v);
tvMessage = (TextView) itemView.findViewById(R.id.tvMessage);
tvDateSending = (TextView) itemView.findViewById(R.id.tvDateSending);
ivMessenger = (CircleImageView) itemView.findViewById(R.id.ivMessenger);
linearLayout= (LinearLayout) itemView.findViewById(R.id.llOneToOneChat);
v.setOnCreateContextMenuListener(this);
}
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
menu.add(0,1 , 0, "Edit");
menu.add(0, COPY, 0, "Copy");
menu.add(0, DELETE, 0, "Delete");
}
}
消息适配器类:
public class MessageAdapter extends FirebaseRecyclerAdapter<Message, MessageViewHolder>{
private Context context;
private long prevMessageTime=0;
public int position;
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}
public MessageAdapter(Class<Message> modelClass, int modelLayout, Class<MessageViewHolder> viewHolderClass, DatabaseReference ref, Context context) {
super(modelClass, modelLayout, viewHolderClass, ref);
this.context = context;
}
@Override
protected void populateViewHolder(MessageViewHolder viewHolder, Message message, final int position) {
//do something
viewHolder.tvMessage.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
setPosition(position);
return false;
}
});
}
}
希望它对你有用 这是我在这里的第二个问题,所以我没有经验,如果你需要其他信息或任何东西,请随时询问。谢谢你,但现在我有另一个问题,我的菜单信息是空的。我会寻找解决办法的。thx无论如何都是信息。这是什么意思?ContextMenu.ContextMenuInfo menuInfo from onCreateContextMenu,它应该保存所选的视图信息。我认为该位置足以从数据数组中获取数据
@Override
public boolean onContextItemSelected(MenuItem item) {
int position = -1;
try {
position = messageAdapter.getPosition();
} catch (Exception e) {
// Log.d(TAG, e.getLocalizedMessage(), e);
return super.onContextItemSelected(item);
}
switch (item.getItemId()) {
case 1:
// do your stuff
break;
case 2:
// copy message
if (position!= -1){
ClipboardManager clipboard = (ClipboardManager) OneToOneConversationActivity.this.getSystemService(Context.CLIPBOARD_SERVICE);
String text = messageAdapter.getItem(position).getMessage();
ClipData clip = android.content.ClipData.newPlainText("Copied Text", text);
clipboard.setPrimaryClip(clip);
}
break;
case 3:
//delete message
if (position!= -1)
messageAdapter.getRef(position).removeValue();
break;
}
return super.onContextItemSelected(item);
}