Search code examples
xamarin.android

How to remove item from array in image adapter. Xamarin gallery


public class ImageAdapter : BaseAdapter
{
    Context context;

    public ImageAdapter (Context conn)
    {
          context = conn;
    }

    public override int Count { get { return thumbIds.Length; } }

    public override Java.Lang.Object GetItem (int position)
    {
          return null;
    }

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

    // create a new ImageView for each item referenced by the Adapter
    public override View GetView (int position, View convertView, ViewGroup parent)
    {
          ImageView pic = new ImageView (context);

          pic.SetImageResource (thumbIds[position]);
          pic.LayoutParameters = new Gallery.LayoutParams (500, 500);
          pic.SetScaleType (ImageView.ScaleType.FitXy);

          return pic;
    }

    // references to our images
    int[] thumbIds = {
            Resource.Drawable.image_1,
            Resource.Drawable.image_2,
            Resource.Drawable.image_3,
            Resource.Drawable.image_4,
            Resource.Drawable.image_5,
            Resource.Drawable.image_6,
            Resource.Drawable.image_7
     };
}

How to remove item from array https://learn.microsoft.com/en-us/xamarin/android/user-interface/controls/gallery Gallery


Solution

  • Do you want to achieve the result like following GIF?

    enter image description here

    I advice your to use List<int> to replace of int[], then you can add a method called removeItem in the ImageAdapter like following code.

    public void removeItem(int numToRemove)
            {
    
                if (numToRemove < thumbIds.Count)
                {
                    thumbIds.RemoveAt(numToRemove);
                    this.NotifyDataSetChanged();
                }
    
            }
    

    Here is code about ImageAdapter.cs

    using Android.Views;
    using Android.Widget;
    using Java.Lang;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace App25
    {
        internal class ImageAdapter : BaseAdapter
        {
            private MainActivity mainActivity;
    
            public ImageAdapter(MainActivity mainActivity)
            {
                this.mainActivity = mainActivity;
            }
    
            public override int Count { get { return thumbIds.Count; } }
    
            public override Java.Lang.Object GetItem(int position)
            {
                return thumbIds[position];
            }
    
            public override long GetItemId(int position)
            {
                return position;
            }
    
            // create a new ImageView for each item referenced by the Adapter
            public override View GetView(int position, View convertView, ViewGroup parent)
            {
                ImageView pic = new ImageView(mainActivity);
    
                pic.SetImageResource(thumbIds[position]);
                pic.LayoutParameters = new Gallery.LayoutParams(500, 500);
                pic.SetScaleType(ImageView.ScaleType.FitXy);
    
                return pic;
            }
            public void removeItem(int numToRemove)
            {
    
                if (numToRemove < thumbIds.Count)
                {
                    thumbIds.RemoveAt(numToRemove);
                    this.NotifyDataSetChanged();
                }
    
            }
            // references to our images
            List<int> thumbIds = new List<int> {
                Resource.Drawable.faded_div,
                Resource.Drawable.icon,
                Resource.Drawable.faded_div1,
                Resource.Drawable.icon1,
                Resource.Drawable.faded_div,
                Resource.Drawable.icon2,
                Resource.Drawable.faded_div
         };
        }
    }
    

    Here is MainActivity.cs

       [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
        public class MainActivity : AppCompatActivity
        {
            ImageAdapter imageAdapter;
            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);
                Gallery gallery = (Gallery)FindViewById<Gallery>(Resource.Id.gallery1);
                Button button1 = FindViewById<Button>(Resource.Id.button1);
                imageAdapter = new ImageAdapter(this);
                gallery.Adapter = imageAdapter;
                button1.Click += Button1_Click;
    
            }
            int removeItem = 0;
            private void Button1_Click(object sender, System.EventArgs e)
            {
    
    
                imageAdapter.removeItem(removeItem);
    
    
            }
      }
    

    Here is my activity_main.xml.

    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content" 
                android:text="remove"
                android:id="@+id/button1"
            />
            <Gallery
            android:id="@+id/gallery1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </LinearLayout>
    

    =============Update==================

    If you want to achieve the long click ,push alert, then delete the item, you can refer to achieve a longclick event for your gallery like following code.

      gallery.ItemLongClick += Gallery_ItemLongClick; 
    
      private void Gallery_ItemLongClick(object sender, AdapterView.ItemLongClickEventArgs e)
            {
                // throw new System.NotImplementedException();
    
                Android.App.AlertDialog.Builder dialog = new Android.App.AlertDialog.Builder(this);
                Android.App.AlertDialog alert = dialog.Create();
                alert.SetTitle("Title");
                alert.SetMessage("Do you want to remove this select item");
                alert.SetButton("OK", (c, ev) =>
                {
                    // Ok button click task  
                    imageAdapter.removeItem(e.Position);
                });
                alert.Show();
    
    
    
            }
    
    

    Here is my running GIF.

    enter image description here