简体   繁体   English

Xamarin Android:在上下文操作模式下单击后退按钮时,如何取消选择recyclerview行

[英]Xamarin Android: How to unselect recyclerview rows when i click on the back button on contextual action mode

Hello everyone my name is Taniguchi. 大家好,我叫谷口

I've made a recylerview and inserted a contextual action mode and i coded when there is no row selected the contextual action mode finishes. 我做了一个recylerview并插入了一个上下文动作模式,并且当没有选择任何行时,我会进行编码。

But im having trouble when i click the back button of contextual action mode or i click on the back button on my phone when the contextual action mode is activated the rows stays selected. 但是,当我单击上下文动作模式的后退按钮或激活上下文动作模式时,单击手机上的后退按钮时,我遇到了麻烦。

My contextual action mode class: 我的上下文动作模式类:

 public class MyActionMode : Java.Lang.Object, ActionMode.ICallback
{

    private RecyclerViewHolder holder;
    private Context mContext;
    private RecyclerView.Adapter mAdapter;
    private int currentPosition;
    private Button button;
    public View v;
    public static bool ismenuactivated = true;
    private IMenu menu;
    private View menuItemView;
    private List<Email> mEmails;
    public CheckBox cbx;
    public View itemView;
    private RecyclerView mRecyclerView;

    public MyActionMode(Context context) : this(context, null, 0)
    {

    }

    public MyActionMode(Context context, RecyclerView.Adapter adapter, int position)
    {
        mContext = context;
        mAdapter = adapter;
        currentPosition = position;
    }

    public bool OnActionItemClicked(ActionMode mode, IMenuItem item)
    {

        switch (item.ItemId)
        {
            case Resource.Id.itemOneId:
                return true;
            case Resource.Id.itemTwoId:
                // do Update
                return true;
            default:
                return false;
        }
    }

    public bool OnCreateActionMode(ActionMode mode, IMenu menu)
    {
        mode.MenuInflater.Inflate(Resource.Menu.ContextualMenu, menu);
        //------------------------------------------

        button = (Button)menu.FindItem(Resource.Id.itemTwoId).ActionView;
        button.Background = null;
        var draw = ContextCompat.GetDrawable(mContext, Resource.Drawable.three_dots);
        button.SetCompoundDrawablesWithIntrinsicBounds(draw, null, null, null);
        button.Click += delegate {
            PopupMenu menu1 = new PopupMenu(mContext, button);
            menu1.Inflate(Resource.Menu.popup_menu);
            menu1.Show();
        };

        return true;
    }

    public void OnDestroyActionMode(ActionMode mode)
    {
        mode.Dispose();

    }

    public bool OnPrepareActionMode(ActionMode mode, IMenu menu)
    {
        return false;
    }
}

My RecyclerView Adapter: 我的RecyclerView适配器:

public class RecyclerAdapter : RecyclerView.Adapter, View.IOnClickListener, View.IOnLongClickListener
{
    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 bool count = false;
    public int CountAuxiliar = 0;
    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);
        return vh;
    }
    public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
    {
        RecyclerViewHolder myHolder = holder as RecyclerViewHolder;
        myHolder.cbx.Visibility = mEmails[position].IsSelected() ? ViewStates.Visible : ViewStates.Gone;
        myHolder.cbx.Checked = mEmails[position].IsSelected();
        if(MyActionMode.ismenuactivated == false){
            myHolder.cbx.Visibility = ViewStates.Gone;
        }

        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);
    }
    void View.IOnClickListener.OnClick(View v)
    {
        if (CountAuxiliar > 0 && mode != null)
        {
            int position = (int)v.Tag;
            mEmails[position].setSelected(!mEmails[position].IsSelected());
            v.SetBackgroundColor(mEmails[position].IsSelected() ? Color.LightBlue : Color.Transparent);
            v.FindViewById(Resource.Id.checkBox1).Visibility = mEmails[position].IsSelected() ? ViewStates.Visible : ViewStates.Invisible;
            if (mEmails[position].IsSelected())
            {
                CountAuxiliar++;
            }
            else
            {
                CountAuxiliar--;
            }
            mode.Title = CountAuxiliar.ToString() + " " + "Selecionados";
            Toast.MakeText(v.Context, "Click : " + CountAuxiliar + "---" + position, ToastLength.Short).Show();
        }
        if (CountAuxiliar < 1 && count == true)
        {
          count = false;
          mode.Finish();
          MainActivity.bottomnavigationview1.Visibility = ViewStates.Gone;
          MainActivity.floatinactionbutton1.Visibility = ViewStates.Visible;
        }
    }
    public bool OnLongClick(View v)
    {

        if (CountAuxiliar < 1)
        {
            CountAuxiliar = 1;
            count = true;
            int position = (int)v.Tag;
            mEmails[position].setSelected(!mEmails[position].IsSelected());
            v.SetBackgroundColor(mEmails[position].IsSelected() ? Color.LightBlue : Color.Transparent); MainActivity.bottomnavigationview1.Visibility = ViewStates.Visible;
            MainActivity.floatinactionbutton1.Visibility = ViewStates.Gone;
            v.FindViewById(Resource.Id.checkBox1).Visibility = mEmails[position].IsSelected() ? ViewStates.Visible : ViewStates.Invisible;
            mActionMode = new MyActionMode(mActivity, this, position);
            mode = mActivity.StartActionMode(mActionMode);
            mode.Title = CountAuxiliar.ToString() + " " + "Selecionado";
            count = true;

            Toast.MakeText(v.Context, "Long Click : " + mEmails[position].IsSelected() + "---" + position, ToastLength.Short).Show();
        }
        return true;
    }
}

My Click Listener: 我的点击监听器:

public class RecyclerViewHolder : RecyclerView.ViewHolder
{
    public TextView mName;
    public TextView mSubject;
    public TextView mMessage;
    public CheckBox cbx;
    public Button bottonbutton;
    public int count = 0;
    private Action<object, View.LongClickEventArgs, int> onLongClick;

    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);
        cbx = itemView.FindViewById<CheckBox>(Resource.Id.checkBox1);
    }
}

I wonder how to unselect rows, the color went back to white when i click on the back button of the contextual action mode or click on the back button of the phone when the contextual action mode is activated. 我想知道如何取消选择行,当我单击上下文操作模式的后退按钮时或在激活上下文操作模式时单击电话的后退按钮时,颜色会变回白色。

You should deal with the logic in method OnDestroyActionMode when you press the back button on contextual action mode. 在上下文操作模式下按“ back按钮时,应处理方法OnDestroyActionMode的逻辑。

public void OnDestroyActionMode(ActionMode mode)
{
    mode.Dispose();
 //**** remove selection here  ***
    mAdapter.removeSelection();

}

And add function removeSelection in your RecyclerAdapter 并在RecyclerAdapter添加功能removeSelection

public void removeSelection()
    {
        //here deal with your data and refresh UI.
         //assign all the value of `IsSelected` to false of mEmails list
        if (mEmails!=null ) {
           foreach (Email email in mEmails) {
              email.setSelected(false);
         }

        // refresh UI
        NotifyDataSetChanged();
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何从上下文操作模式处理recyclerView项目的单击侦听器? - How handle click listener for recyclerView item from contextual action mode? 按下物理后退按钮时,上下文操作栏(操作模式)总是被破坏 - Contextual Action bar (Action mode) always gets destroyed when physical back button is pressed 当我单击上下文操作栏上的项目时如何插入菜单 - How to insert a menu when i click in a item on the contextual action bar 我们如何在Android上下文操作栏中显示后退按钮而不是完成(选中标记)按钮 - How do we show a back button instead of done(checkmark) button in the contextual action bar on Android 在Recyclerview片段中实现上下文操作模式的问题 - Problems with implementing contextual action mode in recyclerview fragment 具有上下文操作模式的RecyclerView可以删除项目问题 - RecyclerView with Contextual Action Mode to delete an item issue android 后退按钮点击动作 - android on back button click action Xamarin Android:如何在 ai 单击 recyclerview 项目时从主要活动中隐藏项目 - Xamarin Android: How to hide a item from mainactivity when a i click on recyclerview item Android上下文操作栏 - 获取RecyclerView位置 - Android Contextual Action Bar - Get RecyclerView Position 在上下文操作模式下选择列表片段时,如何更改列表片段中列表项目的背景颜色 - How can i change the background color of list item in list fragment when it is selected on with the contextual action mode
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM