0

我有一个列表视图,它有一个文本视图和一个图像按钮(删除)。当我单击图像按钮时,该行被删除并且列表视图被更新。

一切工作正常,但问题是当列表视图中有不止一行时,删除一行后,我无法删除另一行,因为位置值不合适。

说清楚,例如:列表视图中有 3 行。

  • 我单击要删除的第一行(位置值为 0),它被删除并且列表视图被更新。

所以现在有两行,

  • 我再次单击第一行,但删除失败。(因为 listview 没有更新位置值,实际上现在它的位置值应该是 0,而是显示 1,有时显示 2)

这是我的代码,

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();
}
4

5 回答 5

1

完成删除部分后,您应该使用通知您的适配器notifyDataSetChanged()

更新

我认为发生这种情况是因为您使用视图的标签作为索引,这样您的索引就不会改变。getView您应该使用标记为的方法提供的索引final int position

编辑

您可以尝试以下代码而不是您发布为 EDIT 的代码吗

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();
}
于 2013-02-12T11:50:35.997 回答
0

Try resetting the adapter after the delete:

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);
}
于 2013-02-12T15:58:56.220 回答
0

您已经创建DataFields了保存记录的类。因此,从该数组列表或哈希图中删除任何对象(无论您使用过什么),然后在从列表中删除任何对象后编写下面的代码。

adapter.notifyDataSetChanged();

在这里,适配器是您的自定义适配器。

编辑

public class Contants extends Application
{
    public int xyz;
}

如果你喜欢使用这个xyz对象,你只需要写,

((Contants) getApplicationContext()).xyz;
于 2013-02-12T11:52:14.753 回答
0

尝试这个:

//Using the position we can
Object obj = adapter.getItem(position);
adapter.remove(obj);
//Notify the adapter
adapter.notifyDataSetChanged();
于 2013-02-12T11:53:58.203 回答
0

我认为这可能是因为您正在删除一个项目,但它仍在 ViewHolder 中,因此您应该在删除后更新您的 ViewHolder DataFields。

于 2013-02-12T11:54:47.127 回答