C# 在RecyclerView Xamarin Android中,一次点击按钮即可显示一些弹出菜单
我无法显示弹出菜单。当我点击ImageButton时,显示屏上显示了几个弹出菜单(对于不同的元素-在ClickedPopUpMenu的click listener中,我显示了带位置的toast)C# 在RecyclerView Xamarin Android中,一次点击按钮即可显示一些弹出菜单,c#,xamarin.android,android-recyclerview,popupmenu,C#,Xamarin.android,Android Recyclerview,Popupmenu,我无法显示弹出菜单。当我点击ImageButton时,显示屏上显示了几个弹出菜单(对于不同的元素-在ClickedPopUpMenu的click listener中,我显示了带位置的toast) 使用系统; 使用System.Collections.Generic; 利用制度全球化; 使用System.Linq; 使用System.Text.RegularExpressions; 使用Android.App; 使用Android.Support.V7.Widget; 使用Android.View
使用系统;
使用System.Collections.Generic;
利用制度全球化;
使用System.Linq;
使用System.Text.RegularExpressions;
使用Android.App;
使用Android.Support.V7.Widget;
使用Android.Views;
使用Android.Widget;
使用DexpensMobile.Core.Models;
使用DexpensMobile.Core.Services;
使用DexpensMobile.Core.Services.AuthService;
使用Dexpensomobile.Droid.Screens;
使用UniversalImageLoader.Core;
使用UniversalImageLoader.Core.Display;
使用PopupMenu=Android.Widget.PopupMenu;
命名空间DexpensMobile.Droid.Adapters
{
公共类PostListAdapter:RecyclerView.Adapter
{
受保护的活动上下文=null;
受保护的IList任务=新列表();
ImageLoader _ImageLoader;
私人位置;
私有int TYPE_头=0;
私有int类型_项=1;
公共事件事件处理程序项单击;
公共PostListAdapter(IList任务、活动上下文)
{
这个。任务=任务;
_imageLoader=imageLoader.Instance;
this.context=上下文;
}
公共PostListAdapter(){}
公共覆盖长GetItemId(int位置)
{
返回位置;
}
公共覆盖int GetItemViewType(int位置)
{
if(IsPositionHeader(位置))
返回Resource.Layout.wall_标题;
返回Resource.Layout.ItemPost;
}
专用bool IsPositionHeader(内部位置)
{
返回位置==0;
}
公共覆盖无效OnBindViewHolder(RecyclerView.ViewHolder,int位置)
{
if(holder.GetType()==typeof(PostViewHodler))
{
PostViewHodler vh=作为PostViewHodler的支架;
变量项=任务[位置1];
var_userData=ServiceLocator.GetService().GetUserData();
vh.ShowPopUpMenuButton.Click+=(发送者,e)=>按钮点击(发送者,e,位置);
var=item.Text;
if(试探文本结尾(“
”)
试探文本=试探文本子字符串(0,试探文本长度-5);
试探文本=试探文本。替换(“
,“\n”);
TENTEXT=Regex.Replace(TENTEXT,@“^\s+$[\n]*”,“”,RegexOptions.Multiline);
vh.PostText.Text=testext;
vh.OwnerFullName.Text=item.CreatorName;
vh.DateText.Text=item.CreatedDate.ToString(CultureInfo.InvariantCulture);
vh.LikeText.Text=item.Like.likeCount>0
?item.Like.likeCount.ToString()
: "";
vh.CommentText.Text=item.Comments.Any()?item.Comments.Count().ToString():“”;
vh.RepostText.Text=item.SharedCount>0?item.SharedCount.ToString():“”;
var期权=
新建DisplayImageOptions.Builder()
.CacheInMemory(false)
.CacheOnDisk(错误)
.显示器(新的圆形位图显示器(500))
.Build();
_imageLoader.DisplayImage(item.AvatarUrl、vh.AvatarProfile、选项);
}
else if(holder.GetType()==typeof(postViewHodleReader))
{
PostViewHodlerHeader vh=作为PostViewHodlerHeader的支架;
vh.OwnerNameHeader.Text=“Hi from header:-)”;
}
}
私有无效按钮\单击(对象发送者、事件参数、事件参数、int位置)
{
ImageButton im=发送方作为ImageButton;
PopupMenu=新的PopupMenu(im.Context,im);
菜单.充气(资源.菜单.弹出菜单);
//if(item.applicationSerid!=\u userData.UserId)
//{
menu.menu.FindItem(Resource.Id.editPopUp).SetVisible(false);
menu.menu.FindItem(Resource.Id.deletePopUp).SetVisible(false);
//}
menu.Show();
Toast.MakeText(context,position.ToString(),ToastLength.Long).Show();
menu.MenuItemClick+=(o,args)=>PopUpMenuClickListener(o,args,位置);
}
public override RecyclerView.ViewHolder OnCreateViewHolder(视图组父级,int-viewType)
{
View itemView=null;
if(viewType==Resource.Layout.wall\u头)
{
itemView=LayoutFlater.From(parent.Context).充气(Resource.Layout.wall_头,parent,false);
PostViewHodlerHeader vhHeader=新的PostViewHodlerHeader(itemView);
返回报头;
}
else if(viewType==Resource.Layout.ItemPost)
{
itemView=LayoutFlater.From(parent.Context).充气(Resource.Layout.ItemPost,parent,false);
PostViewHodler vhBody=新的PostViewHodler(itemView、OnClick、tasks);
返回体;
}
返回null;
}
私有void OnClick(内部位置)
{
如果(ItemClick!=null)
项目点击(此,位置);
}
公共覆盖int ItemCount
{
获取{return tasks.Count+1;}
}
私有void PopUpMenuClickListener(对象发送者,PopupMenu.MenuItemClickEventArgs e,int位置)
{
开关(例如Item.ItemId)
{
案例资源.Id.copyLinkPopUp:
打破
案例资源.Id.editPopUp:
((WallActivity)context.EditPost(poppposition);
打破
案例资源.Id.deletePopUp:
((活动)上下文)。删除
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text.RegularExpressions;
using Android.App;
using Android.Support.V7.Widget;
using Android.Views;
using Android.Widget;
using DexpensMobile.Core.Models;
using DexpensMobile.Core.Services;
using DexpensMobile.Core.Services.AuthService;
using DexpensMobile.Droid.Screens;
using UniversalImageLoader.Core;
using UniversalImageLoader.Core.Display;
using PopupMenu = Android.Widget.PopupMenu;
namespace DexpensMobile.Droid.Adapters
{
public class PostListAdapter : RecyclerView.Adapter
{
protected Activity context = null;
protected IList<PostModel> tasks = new List<PostModel>();
ImageLoader _imageLoader;
private int popPosition;
private int TYPE_HEADER = 0;
private int TYPE_ITEM = 1;
public event EventHandler<int> ItemClick;
public PostListAdapter(IList<PostModel> tasks, Activity context)
{
this.tasks = tasks;
_imageLoader = ImageLoader.Instance;
this.context = context;
}
public PostListAdapter() { }
public override long GetItemId(int position)
{
return position;
}
public override int GetItemViewType(int position)
{
if (IsPositionHeader(position))
return Resource.Layout.wall_header;
return Resource.Layout.ItemPost;
}
private bool IsPositionHeader(int position)
{
return position == 0;
}
public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
if (holder.GetType() == typeof(PostViewHodler))
{
PostViewHodler vh = holder as PostViewHodler;
var item = tasks[position-1];
var _userData = ServiceLocator.GetService<IAuthService>().GetUserData();
vh.ShowPopUpMenuButton.Click += (sender, e) => button_Click(sender, e, position);
var tempText = item.Text;
if (tempText.EndsWith("<br/>"))
tempText = tempText.Substring(0, tempText.Length - 5);
tempText = tempText.Replace("<br/>", "\n");
tempText = Regex.Replace(tempText, @"^\s+$[\n]*", "", RegexOptions.Multiline);
vh.PostText.Text = tempText;
vh.OwnerFullName.Text = item.CreatorName;
vh.DateText.Text = item.CreatedDate.ToString(CultureInfo.InvariantCulture);
vh.LikeText.Text = item.Like.LikesCount > 0
? item.Like.LikesCount.ToString()
: "";
vh.CommentText.Text = item.Comments.Any() ? item.Comments.Count().ToString() : "";
vh.RepostText.Text = item.SharedCount > 0 ? item.SharedCount.ToString() : "";
var options =
new DisplayImageOptions.Builder()
.CacheInMemory(false)
.CacheOnDisk(false)
.Displayer(new RoundedBitmapDisplayer(500))
.Build();
_imageLoader.DisplayImage(item.AvatarUrl, vh.AvatarProfile, options);
}
else if (holder.GetType() == typeof(PostViewHodlerHeader))
{
PostViewHodlerHeader vh = holder as PostViewHodlerHeader;
vh.OwnerNameHeader.Text = "Hi from header :-)";
}
}
private void button_Click(object sender, EventArgs eventArgs, int position)
{
ImageButton im = sender as ImageButton;
PopupMenu menu = new PopupMenu(im.Context, im);
menu.Inflate(Resource.Menu.popup_menu);
//if (item.ApplicationUserId != _userData.UserId)
//{
menu.Menu.FindItem(Resource.Id.editPopUp).SetVisible(false);
menu.Menu.FindItem(Resource.Id.deletePopUp).SetVisible(false);
//}
menu.Show();
Toast.MakeText(context, position.ToString(), ToastLength.Long).Show();
menu.MenuItemClick += (o, args) => PopUpMenuClickListener(o, args, position);
}
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
View itemView = null;
if (viewType == Resource.Layout.wall_header)
{
itemView = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.wall_header, parent, false);
PostViewHodlerHeader vhHeader = new PostViewHodlerHeader(itemView);
return vhHeader;
}
else if(viewType == Resource.Layout.ItemPost)
{
itemView = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.ItemPost, parent, false);
PostViewHodler vhBody = new PostViewHodler(itemView, OnClick, tasks);
return vhBody;
}
return null;
}
private void OnClick(int position)
{
if (ItemClick != null)
ItemClick(this, position);
}
public override int ItemCount
{
get { return tasks.Count +1; }
}
private void PopUpMenuClickListener(object sender, PopupMenu.MenuItemClickEventArgs e, int position)
{
switch(e.Item.ItemId)
{
case Resource.Id.copyLinkPopUp:
break;
case Resource.Id.editPopUp:
((WallActivity)context).EditPost(popPosition);
break;
case Resource.Id.deletePopUp:
((WallActivity)context).DeleteItem(popPosition);
break;
}
}
}
public class PostViewHodler : RecyclerView.ViewHolder
{
public TextView OwnerFullName { get; private set; }
public ImageView AvatarProfile { get; private set; }
public TextView DateText { get; private set; }
public TextView PostText { get; private set; }
public TextView LikeText { get; private set; }
public TextView CommentText { get; private set; }
public TextView RepostText { get; private set; }
public ImageButton ShowPopUpMenuButton { get; private set; }
public PostViewHodler(View itemView, Action<int> listener, IList<PostModel> posts) : base(itemView)
{
OwnerFullName = itemView.FindViewById<TextView>(Resource.Id.UserName);
AvatarProfile = itemView.FindViewById<ImageView>(Resource.Id.postAva);
DateText = itemView.FindViewById<TextView>(Resource.Id.dateText);
PostText = itemView.FindViewById<TextView>(Resource.Id.postText);
LikeText = itemView.FindViewById<TextView>(Resource.Id.likeText);
CommentText = itemView.FindViewById<TextView>(Resource.Id.commentText);
RepostText = itemView.FindViewById<TextView>(Resource.Id.repostText);
ShowPopUpMenuButton = itemView.FindViewById<ImageButton>(Resource.Id.popupMenuButton);
itemView.Click += (sender, e) => listener(base.Position);
}
}
public class PostViewHodlerHeader : RecyclerView.ViewHolder
{
public TextView OwnerNameHeader{ get; private set; }
public ImageView AvatarProfileHeader { get; private set; }
public PostViewHodlerHeader(View itemView) : base(itemView)
{
OwnerNameHeader = itemView.FindViewById<TextView>(Resource.Id.details);
AvatarProfileHeader = itemView.FindViewById<ImageView>(Resource.Id.avatar_image);
}
}
}