删除自定义ListView中的行

时间:2013-02-12 11:48:08

标签: android android-listview

我有一个列表视图,它有一个textview和一个图像按钮(删除)。单击图像按钮时,该行将被删除,列表视图将更新。

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

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

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

所以现在有两行,

  • 我再次单击第1行并且无法删除。(bcoz位置值没有使用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();
}

5 个答案:

答案 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);
}