Xamarin RecyclerView Click событие, получающее несколько контекстов - PullRequest
0 голосов
/ 30 мая 2018

Я создаю ленту временной шкалы с использованием recyclerview в xamarin, которая содержит элемент, имеющий несколько событий щелчка (дочерний щелчок) в одном элементе в другой позиции (например, YouTube).так как это реализовано в случае повторного просмотра, я определил событие click внутри адаптера в методе onBind.Все работает нормально, но после прокрутки списка вверх или вниз, а затем нажмите кнопку запуска нескольких событий, получив контекст всех тех элементов, которые были в этой позиции нажатия.

Предположим, при запуске приложения item2 находился впо центру (где мы будем щелкать), затем проводим пальцем вверх и получаем item4 в центре, а затем снова проводим пальцем вниз, получая item3 в центре, наконец щелкните item3 (центральная позиция).и мы получаем результат события click для всех элементов, которые были в этой позиции.это означает, что событие щелчка 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; }
    }
}

Пожалуйста, предложите мне решение, чтобы это исправить, спасибо.

1 Ответ

0 голосов
/ 31 мая 2018

Я думаю, причина в том, что вы добавляете событие click в методе OnBindViewHolder().Каждый раз, когда строка снова появляется на экране, запускается OnBindViewHolder(), и к вашему виду добавляется дополнительное событие щелчка, чтобы оно получало несколько контекстов.

Вместо этого вы можете использовать ClickListener и установить позицию для тега.зренияНапример:

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;
    }
...