ListView控件只删除最后项目 [英] ListView remove only last items

查看:128
本文介绍了ListView控件只删除最后项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个自定义适配器列表视图,我有问题,从列表中删除的项目。这里是列表行定义

I have List view with custom adapter and I have problem with removing items from list. Here is definition of list row

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:descendantFocusability="blocksDescendants">

    <CheckBox
        android:id="@+id/history_list_check"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="10dp" 
        android:layout_alignParentBottom="true"
        android:layout_alignParentTop="true"/>

    <TextView
        android:id="@+id/history_list_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentTop="true"
        android:layout_toRightOf="@id/history_list_check"/>

    <ImageView
        android:id="@+id/history_list_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:contentDescription="@string/history_drunk_image_description"
        android:layout_alignParentBottom="true"
        android:layout_alignParentTop="true"
        />

</RelativeLayout> 

我的自定义适配器:

My custom adapter:

public class HistoryArrayAdapter extends ArrayAdapter<Measure> {

private final List<HistoryRowModel> list;
private final Activity context;

public HistoryArrayAdapter(Activity context, List<Measure> list) {
    super(context, R.layout.history_list_row, list);
    this.context = context;
    this.list = new ArrayList<HistoryRowModel>();

    for(Measure measure : list) {
        HistoryRowModel rowModel = new HistoryRowModel(measure);
        this.list.add(rowModel);
    }
}

static class ViewHolder {
    protected CheckBox checkbox;
    protected TextView text;
    protected ImageView imageView;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = null;
    if (convertView == null) {

        LayoutInflater inflator = context.getLayoutInflater();
        view = inflator.inflate(R.layout.history_list_row, null);

        final ViewHolder viewHolder = new ViewHolder();
        viewHolder.checkbox = (CheckBox) view.findViewById(R.id.history_list_check);
        viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                HistoryRowModel element = (HistoryRowModel) viewHolder.checkbox.getTag();
                element.setSelected(buttonView.isChecked());
            }
        });

        viewHolder.text = (TextView) view.findViewById(R.id.history_list_label);
        viewHolder.imageView = (ImageView) view.findViewById(R.id.history_list_image);

        view.setTag(viewHolder);
        viewHolder.checkbox.setTag(list.get(position));
    } else {
        view = convertView;
        ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));
    }

    ViewHolder holder = (ViewHolder) view.getTag();
    holder.checkbox.setChecked(list.get(position).isSelected());

    HistoryRowModel rowModel = list.get(position);
    Measure measure = rowModel.getMeasure();
    long time = measure.getTimestamp();
    DateFormat dateFormat = SimpleDateFormat.getDateInstance();
    holder.text.setText(dateFormat.format(time));

    int resource = getImage(measure.getThreshold());
    if(resource == -1)
    {
        holder.imageView.setImageResource(R.drawable.unknown);
    }
    else
    {
        holder.imageView.setImageResource(resource);
    }

    return view;
}
} 

和这里是我remove从列表code:

And here is my remove from list code:

private void removeSelectedRows() {
    View v;
    CheckBox cb;
    for (int i = 0; i < list.getCount(); i++) {
        v = list.getAdapter().getView(i, null, null);
        cb = (CheckBox) v.findViewById(R.id.history_list_check);
        if(cb.isChecked())
        {
            removeMeasure(i);
        }
    }
}

private void removeMeasure(long rowId) {

    Measure toRemove = adapter.getItem((int)rowId);

    try {
        Dao<Measure, Integer> measureDao = databaseHelper.getMeasureDao();
        DeleteBuilder<Measure, Integer> db = measureDao.deleteBuilder();
        db.where().eq("id", toRemove.getId());
        measureDao.delete(db.prepare());
    }
    catch(Exception e) {
        e.printStackTrace();
    }

    adapter.remove(toRemove);
}

我的问题是,当我检查一些项目,然后调用removeSelectedRows其remove从列表总是最后一个项目。然后,当我从这个活动返回,然后再返回去它变成了正确的行来自数据库和列表显示正确的列表行删除。因此,它看起来像行

My problem is that when I check some item and then invoke removeSelectedRows its remove always last item from list. Then when I return from this activity and go back again it's turn out that the proper row was delete from database and list show proper list rows. So it's looks like line

adapter.remove(toRemove);

从适配器删除错误的项目。任何想法有什么不对这个code?

remove wrong item from adapter. Any idea what is wrong with this code?

njzk2是对他的评论

njzk2 was right in his comment

推荐答案

替换所有的适配器 list.getAdapter调用()来电。或者至少向我们展示了如何初始化适配器变量。

Replace all your adapter calls with list.getAdapter() calls. Or at least show us how you initialize the adapter variable.

编辑:notifyOnChange标志是默认设置,以便调用下列任何适配器方法将调用notifyDataSetChanged同一对象的()方法真:添加(T),插入(T),删除(T),清()

The notifyOnChange flag is 'true' by default so calling any of the following adapter methods will invoke the notifyDataSetChanged() method of the same object: add(T), insert(T), remove(T), clear()

这篇关于ListView控件只删除最后项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆