android - Xamarin RecyclerView Click 事件获取多个上下文

标签 android visual-studio xamarin android-recyclerview adapter

我正在使用 xamarin 中的 recyclerview 创建时间线提要,其中包含在不同位置(如 youtube)的单个项目中具有多个点击事件(子点击)的项目。所以在 recyclerview 的情况下实现,我在 onBind 方法中定义了适配器内部的点击事件。一切正常,但在向上或向下滑动列表然后单击通过获取位于该单击位置的所有项目的上下文来启动多个事件。

假设在启动应用程序时,item2 位于中心(我们将单击的位置),然后我们向上滑动并将 item4 置于中心,然后再次向下滑动我们将 item3 置于中心,最后单击 item3(中心位置)。并且我们得到在该位置的所有项目的点击事件的结果。这意味着 item2、item3 和 item4 的点击事件被并行触发。

下面是myadapter的代码-

public class RecyclerAdapter : RecyclerView.Adapter
{
    private List<Article> mArticle;
    private Context mContext;
    public RecyclerAdapter(List<Article> articles, Context context)
    {
        mArticle = articles;
        mContext = context;
    }
    public class MyView : RecyclerView.ViewHolder
    {
        public View mMainView { get; set; }
        public CircleImageView mauthor { get; set; }
        public ImageView mthumb { get; set; }
        public TextView mname { get; set; }
        public TextView title { get; set; }
        public CardView post_card { get; set; }
        public MyView(View view) : base(view)
        {
            mMainView = view;
        }

    }
    public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
    {
        View row = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.post_card, parent, false);
        CircleImageView mauthorimg = row.FindViewById<CircleImageView>(Resource.Id.post_card_profile);
        ImageView mthumbimg = row.FindViewById<ImageView>(Resource.Id.thumbimg);
        TextView mauthorname = row.FindViewById<TextView>(Resource.Id.post_card_author_name);
        TextView articletitle = row.FindViewById<TextView>(Resource.Id.post_title);
        CardView mcard = row.FindViewById<CardView>(Resource.Id.post_card);


        MyView view = new MyView(row)
        {

            mauthor = mauthorimg,
            mthumb = mthumbimg,
            mname = mauthorname,
            title = articletitle,
            post_card = mcard

        };

        return view;
    }

    public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
    {
        MyView myholder = holder as MyView;
        myholder.title.Text = mArticle[position].title;

        if(mArticle[position].thumbimg !=null && mArticle[position].thumbimg != "")
        {
            byte[] thumbimage = Convert.FromBase64String(mArticle[position].thumbimg);
            myholder.mthumb.SetImageBitmap(BitmapFactory.DecodeByteArray(thumbimage, 0, thumbimage.Length));
        }
        else
        {
            myholder.mthumb.SetImageResource(Resource.Drawable.skull);
        }


        if (mArticle[position].author.profileimg != null && mArticle[position].author.profileimg != "")
        {
            byte[] profileimage = Convert.FromBase64String(mArticle[position].author.profileimg);
            myholder.mauthor.SetImageBitmap(BitmapFactory.DecodeByteArray(profileimage, 0, profileimage.Length));
        }
        else
        {

            myholder.mauthor.SetImageResource(Resource.Drawable.profile);
        }

        myholder.mname.Text = mArticle[position].author.name+" "+ mArticle[position].category+" "+ mArticle[position].date;
        myholder.mauthor.Click += (s, e) => { OpenArticle(mArticle[position]._id); };
        myholder.mMainView.Click += (s, e) => {
            OpenArticle(mArticle[position]._id);
        };
        myholder.title.Click += (s, e) => {
            OpenArticle(mArticle[position]._id); 
        };
            myholder.mauthor.Click += (s, e) => {
            if (mArticle[position].author._id!="" && mArticle[position].author._id!=null)
            {
                Intent intent = new Intent(mContext, typeof(Profile_Any_Activity));
                intent.PutExtra("_id", mArticle[position].author._id);
                mContext.StartActivity(intent);
            }

        };


    }

    private void OpenArticle(string id)
    {
        Intent intent = new Intent(mContext, typeof(Article_post));
        intent.PutExtra("_id", id);
        mContext.StartActivity(intent);
    }

    public override int ItemCount
    {
        get { return mArticle.Count; }
    }
}

请建议我解决此问题的解决方案,谢谢。

最佳答案

我认为原因是您在 OnBindViewHolder() 方法中添加了点击事件。 每次该行重新出现在屏幕上时,OnBindViewHolder() 都会触发,并且会向您的 View 添加一个额外的点击事件,因此它会获得多个上下文。

您可以改用 ClickListener 并将位置设置为 View 的标记
例如:

public class RecyclerAdapter : RecyclerView.Adapter,View.IOnClickListener
{    
    ///
    ///Other Code
    ///

    public void OnClick(View v)
    {
        if(v.Id == Resource.Id.post_title)
        {
            OpenArticle(mArticle[(int)v.Tag]._id);
        }
        else if(v.Id == Resource.Id.post_card_author_name){
            //Do something
        }
        else
        {
            OpenArticle(mArticle[(int)v.Tag]._id);
        }            
    }  
}

OnBindViewHolder() 中:

   public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
    {
        ///
        ///Other Code
        ///

        myholder.mMainView.SetOnClickListener(this);
        myholder.mMainView.Tag = position;
        myholder.title.SetOnClickListener(this);
        myholder.title.Tag = position;
    }

关于android - Xamarin RecyclerView Click 事件获取多个上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50599031/

相关文章:

visual-studio - 在 IIS Express 中创建虚拟目录

android - 如何使用 Xamarin.Forms 显示警告框以进行验证?

android - MvxCachingFragmentStatePagerAdapter 传递参数给viewmodel

Android webview 在 2.3 中不滚动,但在 3.0 和 4.0 中工作

android - 如何从另一个类访问共享首选项 bool 值

.net - Visual Studio 新项目向导 : . NET Core 与 .NET Standard 库?

.net - Visual Studio : Is there a way to collapse all items of Solution Explorer?

Xamarin Forms ContextAction MenuItem 文本颜色

android - 将应用 bundle 〜55MB音频的最佳方法

javascript - 从浏览器访问 Android API