仅当在 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
截图:
我的布局中有一个 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
截图: