我有ListView与cusomised适配器扩展BaseAdapter。 listview项目布局包含(textView,Checkbox和imageView)。
要做的是,单击图像视图时,应从listView中删除包含此图像视图的行。
对于一个例子,如果listView包含6个项目,并且用户在listView中打开第4个项目的imageView,则应该从列表视图中删除第4行, 因此,lisview应该包含5个项目,依此类推。
我尝试的是,在getView()方法"发布在"在Baseadapter中,我创建了imageview的onClickListener,它如下:
iv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
parent.removeView(convertView);
notifyDataSetChanged();
}
});
问题是,在上面提到的监听器中,我必须将converView设置为final,并且应该将convertView赋值给它以初始化它,如果它为null,那么它不能是final,
现在我不知道如何解决这个问题,我不确定我的方式是否是从listView中删除项目的正确方法
getView :
@Override
public View getView(int position, final View convertView, final ViewGroup parent) {
// TODO Auto-generated method stub
if (convertView == null) {
LayoutInflater layoutinflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = layoutinflater.inflate(R.layout.list_items_layout, null);// here convertView cannot be final
}
final TextView tv = (TextView) convertView.findViewById(R.id.tvlist_topic);
final CheckBox cb = (CheckBox) convertView.findViewById(R.id.cbList_hook);
final ImageView iv = (ImageView) convertView.findViewById(R.id.ivList_delete);
tv.setText(this.arrayList.get(position));
iv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
parent.removeView(convertView);
notifyDataSetChanged();
}
});
return convertView;
}
答案 0 :(得分:1)
要实现它,您必须从数据集中删除元素并调用notifydatasetchanged,以重新安排重写ListView的行。您需要的是要删除的行的位置。你可以做的是用位置标记iv对象,并在按下它时检索标记:
iv.setTag(position);
iv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (v.getTag() != null) {
arrayList.remove((int) v.getTag);
notifyDataSetChanged();
}
}
});
答案 1 :(得分:0)
要更新视图,您应该通过位置从ArrayList中删除元素,然后调用notifydataSetChanged()
答案 2 :(得分:0)
问题是您正在尝试销毁视图,但是您应该删除ArrayList中创建ListView中每个元素的条目。
//assuming that the data source for your listview is called "arrayList"
//this code should be in your getView() method
//set the position as a tag on your view
iv.setTag(position);
iv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//retrieve the tag
int posToRemove= (int) v.getTag();
//remove position from your source array
arrayList.remove(posToRemove);
//let your adapter know that there was a change in the dataset
notifyDataSetChanged();
}
});
答案 3 :(得分:0)
你怎么做convertView
和parent
最终?我有一个类似的用例,在我的适配器(扩展ArrayAdapter
)中我有
@Override
public View getView(int position, View convertView, ViewGroup parent) {
}
Eclipse是否提示您添加final
修饰符?
监听
public void onClick(DialogInterface dialog, int id) {
doDelete();
}
ListActivity
private void doDelete() {
Item[] newList = new Item[_itemList.length -1];
// ... update the Array
itemList= newList ;
setListAdapter(new YourAdapter(this, R.layout.list_item, _itemList));
}
答案 4 :(得分:0)
从适配器中删除数据,然后调用notifyDataSetChanged()。列表将刷新。不要从列表中删除视图。