我有一个列表视图,它有一个textview和一个图像按钮(删除)。单击图像按钮时,该行将被删除,列表视图将更新。
一切正常,但问题是当列表视图中有多一行时,删除一行后,由于位置值不合适,我无法删除另一行。
说清楚,例如:列表视图中有3个。
所以现在有两行,
这是我的代码,
CustomListView.class
public View getView(final int position, View convertView, ViewGroup parent) {
holder = null;
DataFields rowItems = (DataFields) getItem(position);
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = inflater.inflate(R.layout.home_field_row, null);
holder = new ViewHolder();
holder.dataFields = items.get(position);
holder.mName = (TextView) convertView
.findViewById(R.id.hmFieldName);
holder.mDeleteImage = (ImageView) convertView
.findViewById(R.id.hmFieldDeleteImage);
holder.mDeleteImage.setTag(position);
holder.mDeleteImage
.setOnClickListener(new ImageView.OnClickListener() {
@Override
public void onClick(final View v) {
Log.d("POSITION****", String.valueOf(position));
final Integer index = (Integer) v.getTag();
holder.dataFields = items.get(position);
value = holder.dataFields.getId();
int status = dbHandler
.deleteField(holder.dataFields);
if (status != 0) {
items.remove(index.intValue());
notifyDataSetChanged(); //ListView is getting updated but not the position values of rows
} else {
Toast.makeText(getContext(),
"Failed to delete !",
Toast.LENGTH_SHORT).show();
}
}
});
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
holder.mName.setText(rowItems.getName());
return convertView;
}
非常感谢任何形式的帮助。谢谢!
被修改
正如大家所说,我做了以下更改但仍然没有更新位置值......
holder.dataFields = items.get(position);
DataFields obj = items.get(position);
value = holder.dataFields.getId();
int status = dbHandler.deleteField(holder.dataFields);
if (status != 0) {
items.remove(index.intValue());
HomeActivity.mAdapter.remove(obj); //I also tried items.remove(obj);
HomeActivity.mAdapter.notifyDataSetChanged();
} else {
Toast.makeText(getContext(), "Failed to delete !", Toast.LENGTH_SHORT).show();
}
答案 0 :(得分:1)
执行删除部分后,您应使用notifyDataSetChanged()
<强>更新强>
我认为这种情况正在发生,因为您使用视图的标记作为索引,这样您的索引就不会改变。您应该使用标有getView
final int position
方法提供的索引
修改强>
您可以尝试使用以下代码而不是您发布为编辑的代码
int status = dbHandler.deleteField(items.get(position));
if (status != 0) {
items.remove(position);
notifyDataSetChanged();
} else {
Toast.makeText(getContext(), "Failed to delete !", Toast.LENGTH_SHORT).show();
}
答案 1 :(得分:0)
您创建了保存记录的DataFields
类。因此,从该数组列表或hashmap中删除任何对象(无论你使用过什么),只需在从列表中删除任何对象后写下代码。
adapter.notifyDataSetChanged();
这里,适配器是您的自定义适配器。
修改强>
public class Contants extends Application
{
public int xyz;
}
如果你想使用这个xyz
对象,你只需要写,
((Contants) getApplicationContext()).xyz;
答案 2 :(得分:0)
试试这个:
//Using the position we can
Object obj = adapter.getItem(position);
adapter.remove(obj);
//Notify the adapter
adapter.notifyDataSetChanged();
答案 3 :(得分:0)
我认为可能是因为您要删除某个项目,但它仍在ViewHolder中,因此您应该在删除后更新ViewHolder DataFields。
答案 4 :(得分:0)
尝试在删除后重置适配器:
list.remove(adapter.getSelectedIndex());
reloadList();
/**
* Fixes bug where the list doesn't update. Call instead of just calling
* notifyDataSetChanged.
*/
private void reloadList(){
adapter.notifyDataSetChanged();
getListView().setAdapter(adapter);
}