c# - 最后一个位置总是从 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; }
}
}
解决方案
使用 ArrayAdapter 中的 remove() 方法从列表中删除所需的项目。
Object toRemove = arrayAdapter.getItem([POSITION]);
arrayAdapter.remove(toRemove);
另一种方法是修改 ArrayList 并在 ArrayAdapter 上调用 notifyDataSetChanged()。
arrayList.remove([INDEX]);
arrayAdapter.notifyDataSetChanged();
推荐阅读
- python-3.x - 将远程 linux 系统时间同步到本地 windows 笔记本电脑
- java - 如何使多边形附加到 3 点钟位置的点
- r - 将第一个非缺失值存储在新列中
- node.js - NodeJS+Express循环调用异步方法
- python - PySFTP 和 get_r 使用 Python - “没有这样的文件或目录”
- ios - 即使变量被硬编码,BMI 应用程序打印结果也是 0
- aem - 找出 Adobe Experience Manager 上次重新启动时间
- javascript - 强制更改标题元素上的文本
- python-2.7 - 如何在 python2 环境中安装 Bazel?
- javascript - 为什么标签显示在选择框内?