首页 > 解决方案 > 最后一个位置总是从 ListView 中删除

问题描述

我正在使用带有自定义适配器的 ListView,并且我想添加都有自己的删除按钮的行。我已经设法添加了行,但是当我按下删除按钮时,它总是删除列表中的最后一个条目,无论我按下什么删除按钮。

我注意到我不是第一个遇到类似问题的人,但我无法弄清楚我的代码有什么问题。

这是我的主要活动:

ListView mListView = FindViewById<ListView>(Resource.Id.listView1);

ListViewAdapter myAdapter = new ListViewAdapter(this);

Button btnAdd = FindViewById<Button>(Resource.Id.btnAdd);

btnAdd.Click += (s,e) =>
{
    myAdapter.AddExercise();

    if(mListView.Adapter == null)
    {
        mListView.Adapter = myAdapter;
    }
};

这是我的自定义适配器的代码:

class ListViewAdapter : BaseAdapter<Exercise>
    {
        private Activity mContext;
        private List<Exercise> mItems = new List<Exercise>();

        public void AddExercise()
        {
            mItems.Add(new Exercise());
            NotifyDataSetChanged();
        }

        public ListViewAdapter (Activity context)
        {
            mContext = context;
        }

        public override Exercise this[int position]

        {
            get { return mItems[position]; }
        } 

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

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

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

        public override View GetView(int position, View convertView, ViewGroup parent)
        {
            MyViewHolder holder = null;
            View row = convertView;

            if (row != null)
            {
                holder = row.Tag as MyViewHolder; 
            }
            if (holder == null)
            {
                row = mContext.LayoutInflater.Inflate(Resource.Layout.row, null);

                holder = new MyViewHolder();

                // setting the spinners

                holder.exercise = row.FindViewById<Spinner>(Resource.Id.spinnerExercise);
                holder.sets = row.FindViewById<Spinner>(Resource.Id.spinnerSets);

                var adapterExercise = ArrayAdapter.CreateFromResource(row.Context, Resource.Array.exercises_array, Android.Resource.Layout.SimpleSpinnerItem);

                adapterExercise.SetDropDownViewResource(Android.Resource.Layout.SimpleSpinnerDropDownItem);
                holder.exercise.Adapter = adapterExercise;

                var adapterSets = ArrayAdapter.CreateFromResource(row.Context, Resource.Array.sets_array, Android.Resource.Layout.SimpleSpinnerItem);

                adapterSets.SetDropDownViewResource(Android.Resource.Layout.SimpleSpinnerDropDownItem);
                holder.sets.Adapter = adapterSets;

                // setting other elements

                holder.reps = row.FindViewById<EditText>(Resource.Id.textReps);
                holder.kgs = row.FindViewById<EditText>(Resource.Id.textKgs);

                // setting button

                holder.removeButton = row.FindViewById<Button>(Resource.Id.remove);

                holder.removeButton.Click += (object sender, EventArgs e) =>
                {
                    int pos = (int)(((Button)sender).GetTag(Resource.Id.remove));
                    mItems.RemoveAt(pos);
                    NotifyDataSetChanged();
                    Toast.MakeText(mContext, "deleted" + pos.ToString(), ToastLength.Long).Show();
                };

                row.Tag = holder;
            }


            holder.removeButton.SetTag(Resource.Id.remove, position);

            return row;
        }


    }

    class MyViewHolder : Java.Lang.Object
    {

        public Spinner exercise { get; set; }
        public Button removeButton { get; set; }
        public Spinner sets { get; set; }
        public EditText reps { get; set; }
        public EditText kgs { get; set; }

    }
}

标签: c#androidxamarin

解决方案


使用 ArrayAdapter 中的 remove() 方法从列表中删除所需的项目。

Object toRemove = arrayAdapter.getItem([POSITION]);
arrayAdapter.remove(toRemove);

另一种方法是修改 ArrayList 并在 ArrayAdapter 上调用 notifyDataSetChanged()。

arrayList.remove([INDEX]);
arrayAdapter.notifyDataSetChanged();

推荐阅读