我有一个ArrayList中的项目集合。我将它们添加到一个客户适配器中,如下所示:
this.m_adapter = new MyAdapter(this, R.layout.myitem,
itemCart.m_items);
我有一个列表中的每个项目都有一个删除按钮,但我不确定如何将删除按钮的onClick()
与ArrayList中的原始项目连接起来。请问有人可以解释一下如何做到这一点,或者指点我去哪里可以阅读有关此问题的教程吗?非讽刺/非轻蔑的回复将不胜感激。
我有一个ArrayList中的项目集合。我将它们添加到一个客户适配器中,如下所示:
this.m_adapter = new MyAdapter(this, R.layout.myitem,
itemCart.m_items);
我有一个列表中的每个项目都有一个删除按钮,但我不确定如何将删除按钮的onClick()
与ArrayList中的原始项目连接起来。请问有人可以解释一下如何做到这一点,或者指点我去哪里可以阅读有关此问题的教程吗?非讽刺/非轻蔑的回复将不胜感激。
itemCart.m_items.remove(<index of element to remove>);
this.m_adapter.notifyDataSetChanged();
接着你需要在适配器上调用notifyDataSetChanged();
来更新ListView
这是我目前的解决方案:
在 getView()
方法中,我做了如下操作:
deleteButton.setTag(position);
看起来getTag()
返回一个对象。因此,我首先将位置int转换为Integer对象。它看起来正在工作。
在OnClickListener()
中,我执行以下操作:
items.remove(index.intValue());
您可以通过注意到列表视图是一个子视图的集合(列表的行)来简单地获取元素的索引。
您可以在代码中执行以下操作:
(例如,在getView()方法中)
row.setOnLongClickListener(new OnLongClickListener()
{
@Override
public boolean onLongClick(View view) {
remove(listView.indexOfChild(view));
return true;
}
}
以下方式适用于我:
/* Read values from resource into an array */
String[] strColorValues = getResources().getStringArray(R.array.colors);
ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < strColorValues.length; i++) {
list.add(strColorValues[i]);
}
ArrayAdapter adapterColors = new ArrayAdapter(getActivity(), android.R.layout.simple_spinner_item, list);
adapterColors.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerColors.setAdapter(adapterPermissionLevels);
spinnerColors.setOnItemSelectedListener(this);
/* Remove first element from the adapter and notify dataset changed. */
String item = spinnerColors.getItemAtPosition(0).toString();
adapterColors.remove(item);
adapterColors.notifyDataSetChanged();
transfer.setItemPosition(position, items.get(position).getAddMode());
public View getView(final int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
final Context context = getContext();
LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.listviewitem_layout, null);
}
ItemEntry item = items.get(position);
if (item != null) {
TextView textViewName = (TextView) v.findViewById(R.id.textViewItemName);
ImageView imageViewDelete = (ImageView) v.findViewById(R.id.imageViewDeleteIcon);
imageViewDelete.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
transfer.showDialog(4);
transfer.setItemPosition(position, items.get(position).getAddMode());
}
});
if (textViewName != null) {
textViewName.setText(item.getItemName());
}
if(imageViewDelete != null) {
imageViewDelete.setImageResource(R.drawable.delete);
}
}
return v;
}
}
mainAdapter.remove(mainAdapter.getItem(position));
mainAdapter.remove(mainAdapter.getItem(mainAdapter.getCount() - 1));
尝试这些代码行,对我非常有帮助
holder.image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
list.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, list.size());
}
});
看起来你可以通过以下方式获取ListView中被点击项的索引(或位置):
listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
listview.remove(listview.getItem(position).toString());
}
}
所以你需要监听视图上的点击事件,然后从中获取索引。
如果您使用上下文菜单,则可以获得 AdapterContextMenuInfo,该结构提供了所点击元素的索引和 ID。
item.getMenuInfo().id
的方式获取元素(这并不简单)。但是您的按钮肯定有索引。 - jcuenod