0

Hello everyone my name is Taniguchi. I did a recyclerview and i trying to change the color of the row when its selected but when i click gives a timeout in this line inside the click function. myHolder.ItemView.SetBackgroundColor(mEmails[position].IsSelected() ? Color.LightBlue : Color.Transparent); I trying to multiple select rows in recyclerview. I followed this documentation How to implement multi-select in RecyclerView? The documentation is in java and i am using C# but i thought it could would, but it didnt work.

My recyclerview adapter:

My model:

 public class RecyclerAdapter : RecyclerView.Adapter
    {
        private View view;
        private Boolean isSelected = false;

        public Boolean IsSelected()
        {
            return isSelected;
        }

        public void setSelected(Boolean selected)
        {
            isSelected = selected;
        }
        private Activity mActivity;
        private MyActionMode mActionMode;
        private List<Email> mEmails;
        private Context context;
        private ActionMode mode;
        public event EventHandler<int> ItemClick;
        public RecyclerAdapter(List<Email> emails, Context context)
        {
            mEmails = emails;
            this.context = context;
        }

        public RecyclerAdapter(List<Email> emails, Activity activity)
        {
            mEmails = emails;
            mActivity = activity;
        }
        public class MyView : RecyclerView.ViewHolder
        {
            public View mMainView { get; set; }
            public TextView mName { get; set; }
            public TextView mSubject { get; set; }
            public TextView mMessage { get; set; }

            public MyView(View view) : base(view)
            {
                mMainView = view;
            }

        }

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

        public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
        {
            LayoutInflater inflater = LayoutInflater.From(parent.Context);
            View row = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.row, parent, false);
            RecyclerViewHolder vh = new RecyclerViewHolder(row, OnClick, OnLongClick);
            return vh;

        }
        void OnLongClick(object sender, View.LongClickEventArgs args, int position)
        {

            mActionMode = new MyActionMode(mActivity, this, position);
            mode = mActivity.StartActionMode(mActionMode);
            ((View)sender).Selected = true;
            selectedPosition = position;
            NotifyDataSetChanged();
            return;
        }

        int selectedPosition = -1;
        public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
        {

            RecyclerViewHolder myHolder = holder as RecyclerViewHolder;
            myHolder.mName.Text = mEmails[position].Name;
            myHolder.mSubject.Text = mEmails[position].Subject;
            myHolder.mMessage.Text = mEmails[position].Message;
            myHolder.ItemView.SetBackgroundColor(mEmails[position].IsSelected() ? Color.LightBlue : Color.Transparent);

        }
        public RecyclerViewHolder myHolder;
        void OnClick(int position)
        {

            mEmails[position].setSelected(!mEmails[position].IsSelected());
            myHolder.ItemView.SetBackgroundColor(mEmails[position].IsSelected() ? Color.LightBlue : Color.Transparent);

        }

    }

public class Email

  {
    public string Name { get; set; }
    public string Subject { get; set; }
    public string Message { get; set; }
    private Boolean isSelected = false;

    public Boolean IsSelected()
    {
        return isSelected;
    }

    public void setSelected(Boolean selected)
    {
        isSelected = selected;
    }
}
Taniguchi.sales
  • 107
  • 1
  • 7
  • Welcome to Stack Overflow! Could you specify what's wrong with what you tried? It appears as if you have some code, but we're not here to write your code for you. Try to come up with a specific, objective question, or a specific problem that's happening. As it stands, your question is likely to be closed as Unclear What You're Asking. – Cullub Aug 09 '19 at 18:31
  • I ve tried according to the document https://stackoverflow.com/questions/36369913/how-to-implement-multi-select-in-recyclerview/40551984 – Taniguchi.sales Aug 09 '19 at 21:53
  • Select multiple rows mas change their colors but the line: – Taniguchi.sales Aug 09 '19 at 21:54
  • myHolder.ItemView.SetBackgroundColor(mEmails[position].IsSelected() is living the terror time on my click funciona – Taniguchi.sales Aug 09 '19 at 21:55
  • Function* i specied ter erro before i put code – Taniguchi.sales Aug 09 '19 at 21:56

1 Answers1

0

RecyclerViewHolder vh = new RecyclerViewHolder(row, OnClick, OnLongClick);

i don't know what is defined in your RecyclerViewHolder ,so i only could give you a simple example:

RecyclerViewHolder.cs:

public class RecyclerViewHolder : RecyclerView.ViewHolder
{

    public TextView mName;
    public TextView mSubject;
    public TextView mMessage;
    private ItemClickListener itemClickListener;
    public RecyclerViewHolder(View itemView) : base(itemView)
    {
        mName = itemView.FindViewById<TextView>(Resource.Id.textView1);
        mSubject = itemView.FindViewById<TextView>(Resource.Id.textView2);
        mMessage = itemView.FindViewById<TextView>(Resource.Id.textView3);
    }
}

then in RecyclerAdapter :

 class RecyclerAdapter : RecyclerView.Adapter,View.IOnClickListener, View.IOnLongClickListener
{
    // add this variable

    private List<Email> mEmails;
    private Context context;

    public RecyclerAdapter(List<Email> mEmails, Context context)
    {
        this.mEmails = mEmails;
        this.context = context;
    }

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



    public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
    {
        RecyclerViewHolder myHolder = holder as RecyclerViewHolder;

        myHolder.mName.Text = mEmails[position].Name;
        myHolder.mSubject.Text = mEmails[position].Subject;
        myHolder.mMessage.Text = mEmails[position].Message;
        myHolder.ItemView.SetBackgroundColor(mEmails[position].IsSelected() ? Color.LightBlue : Color.Transparent);
        myHolder.ItemView.Tag = position;
        myHolder.ItemView.SetOnClickListener(this);
        myHolder.ItemView.SetOnLongClickListener(this);
    }
    public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
    {
        View row = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.row, parent, false);

        RecyclerViewHolder vh = new RecyclerViewHolder(row);
        return vh ;
    }
    public void OnClick(View v)
    {
        int position = (int)v.Tag;
        mEmails[position].setSelected(!mEmails[position].IsSelected());
        v.SetBackgroundColor(mEmails[position].IsSelected() ? Color.LightBlue : Color.Transparent);
        Toast.MakeText(context, "Click : " + mEmails[position] + "---" + position, ToastLength.Short).Show();
    }
    public bool OnLongClick(View v)
    {
        int position = (int)v.Tag;
        Toast.MakeText(v.Context, "Long Click : " + mEmails[position] + "---" + position, ToastLength.Short).Show();
        return true;
    }

}
Leo Zhu
  • 15,726
  • 1
  • 7
  • 23