仅当在 Xamarin 中长按项目时才显示工具栏图标 Android

Show toolbar icon only when item is long clicked in Xamarin Android

我的布局中有一个 Listview,它列出了目录中的文件,我打算在 Listview 中的一个项目被长期选中时在我的操作栏上显示一个删除图标...我已经尝试过该论坛中的一些帖子,但找不到解释如何实现该目标的帖子。 这是控制布局文件行为的 class 文件...

class Notes: AppCompatActivity{
    // Listview declaration
      ListView noteslist;
    protected override void OnCreate(Bundle savedInstanceState){
     //Listview definition
          noteslist = this.FindViewById<ListView>(Resource.Id.noteslist);
          noteslist.Adapter = new ArrayAdapter(this, Android.Resource.Layout.SimpleListItem1, myfile.ListFiles());
        //list item long selection event handler
        noteslist.ItemLongClick += (s, e) =>
                {
                    
                    //Setbackground for selected item
                    for(int i = 0; i < noteslist.Count; i++)
                    {
                        if (e.Position == i)
                        {
                  /*Code to show delete icon on Action bar
                         I tried to override with OnCreateOptionsMenu but it populates the toobar 
                 when OnCreate is called and that is not what i intend to achieve.
                         I want that section of the toolbar to be empty when OnCreate is called and 
       only populate icon when an item on this listis long selected 
                         */
                        }else{
                        
                        }
     }

}

关于使用操作栏删除列表视图项目的上下文操作栏,我做了一个示例,您可以看一下:

Layout.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>

<ListView android:id="@+id/List"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:cacheColorHint="#FFDAFF7F"
/>
</LinearLayout>

MainActivity.cs:

 public class MainActivity : AppCompatActivity
{
    public List<string> items;
   public ListView listView;
    public ActionMode mActionMode;
    public MyAdapter myAdapter;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.activity_main);

        items = new List<string> { "Vegetables", "Fruits", "Flower Buds", "Legumes", "Bulbs", "Tubers" };
        listView = FindViewById<ListView>(Resource.Id.List);
        myAdapter = new MyAdapter(this, items);
        listView.Adapter = myAdapter;

        listView.ItemLongClick += ListView_ItemLongClick; 
        listView.ChoiceMode = ChoiceMode.Multiple;
    }

    private void ListView_ItemLongClick(object sender, AdapterView.ItemLongClickEventArgs e)
    {
        OnListItemSelect(e.Position);
    }

    private void OnListItemSelect(int position)
    {
        myAdapter.toggleSelection(position);
        bool hasCheckedItems = myAdapter.getSelectedCount() > 0;

        if (hasCheckedItems && mActionMode == null)
            mActionMode = StartActionMode(new ActionModeCallback(this));
        else if (!hasCheckedItems && mActionMode != null)
            mActionMode.Finish();

        if (mActionMode != null)
            mActionMode.Title = (myAdapter.getSelectedCount().ToString() + "selected");
    }

    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
    {
        Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

        base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

ActionModeCallBack.cs:

   public class ActionModeCallback : Java.Lang.Object, ActionMode.ICallback
{
    MainActivity parent;

    public ActionModeCallback(MainActivity parent)
    {
        this.parent = parent;
    }

    public bool OnCreateActionMode(ActionMode mode, IMenu menu)
    {
        //wewillcallcab_menu.xmlforsetthe menu
        //wewillcreatecab_menu.xml later
        mode.MenuInflater.Inflate(Resource.Menu.menu1, menu);
        return true;
    }

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

    public bool OnActionItemClicked(ActionMode mode, IMenuItem item)
    {
        switch (item.ItemId)
        {
            //ifuserclickmenu print_me
            case Resource.Id.action_delete:
                //createanalert dialog
                Android.App.AlertDialog.Builder builder = new Android.App.AlertDialog.Builder(parent);
                string msg = "Are you sure you want to delete items?";
                builder.SetMessage(msg)
                  .SetCancelable(false)
                  .SetPositiveButton("Yes", (or, er) => {

                      SparseBooleanArray selected = parent.myAdapter.getSelectedIds();
                      List<string> list_item = new List<string>();
                      for (int i = (selected.Size() - 1); i >= 0; i--)
                      {
                          //checkisvaluecheckedby user
                          if (selected.ValueAt(i))
                          {
                              string selectedItem = (string)parent.myAdapter.GetItem(selected.KeyAt(i));
                              parent.items.Remove(selectedItem);
                              list_item.Add(selectedItem.ToString());
                          }
                      }
                      //print message
                      Toast.MakeText(parent, "YouSelect" + parent.myAdapter.getSelectedCount() + "Item:[" + string.Join(",", list_item) + "]", ToastLength.Long).Show();
                      mode.Finish();

                  })
                .SetNegativeButton("No", (or, er) => {
                    ((Dialog)or).Cancel();
                });

                Android.App.AlertDialog alert = builder.Create();
                alert.Show();

                return true;
            default:
                return false;
        }
    }

    public void OnDestroyActionMode(ActionMode mode)
    {
        parent.myAdapter.removeSelection();
        parent.mActionMode = null;
    }
}

MyAdapter 继承 BaseAdapter:

public class MyAdapter : BaseAdapter<string>
{
    List<string> items;
    Activity context;
    private SparseBooleanArray mSelectedItemsIds;

    public MyAdapter(Activity context, List<string> items) : base()
    {
        this.context = context;
        this.items = items;
        mSelectedItemsIds = new SparseBooleanArray();
    }
    
    public override string this[int position]
    {
        get { return items[position]; }
    }

    public override int Count
    {
        get { return items.Count; }
    }

    public override long GetItemId(int position)
    {
        return position;
    }

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        ViewHolder holder = null;
        View view = convertView; // re-use an existing view, if one is available
        if (view == null || holder == null)
        { // otherwise create a new one
            view = context.LayoutInflater.Inflate(Android.Resource.Layout.SimpleListItem1, null);
            holder = new ViewHolder();

            holder.my_label = view.FindViewById<TextView>(Android.Resource.Id.Text1);
            view.Tag = (holder);
        }
        else
        {
            holder = (ViewHolder)view.Tag;
        }
        holder.my_label.TextSize = 30;//set textSize
        holder.my_label.Text = items[position];//setdata label
                                               //view.FindViewById<TextView>(Android.Resource.Id.Text1).Text = items[position];

        if (mSelectedItemsIds.Size() > 0)
        {
            holder.my_label.SetTextColor(context.LayoutInflater.Context.Resources.GetColor(Resource.Color.grey));
        }

        //checkifcurrentitemhavebeen checked
        //ifyes,changetextcolorwith green
        if (mSelectedItemsIds.Get(position))
        {
            holder.my_label.SetTextColor(context.LayoutInflater.Context.Resources.GetColor(Resource.Color.green));
        }
        return view;
    }

    public void toggleSelection(int position)
    {
        selectView(position, !mSelectedItemsIds.Get(position));
    }

    public void removeSelection()
    {
        mSelectedItemsIds = new SparseBooleanArray();
        NotifyDataSetChanged();
    }

    public void selectView(int position, bool value)
    {
        if (value)
            mSelectedItemsIds.Put(position, value);
        else
            mSelectedItemsIds.Delete(position);

        NotifyDataSetChanged();
    }

    public int getSelectedCount()
    {
        return mSelectedItemsIds.Size();
    }

    public SparseBooleanArray getSelectedIds()
    {
        return mSelectedItemsIds;
    }
}

public class ViewHolder : Java.Lang.Object
{
    public TextView my_label;
}

在资源文件夹中创建菜单文件夹,然后创建menu.xml。

<menu xmlns:android="http://schemas.android.com/apk/res/android">

 <item android:id="@+id/action_delete"
     android:showAsAction="always"
     android:text="Delete"
     android:icon="@drawable/check"/>

 </menu>

如果您有任何问题,请在 github 查看此示例:

https://github.com/CherryBu/ListViewdemo

截图: