ListView控件只删除最后项目 [英] ListView remove only last items
问题描述
我有一个自定义适配器列表视图,我有问题,从列表中删除的项目。这里是列表行定义
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屋!