android ListView:删除一行时如何通知datasource?

时间:2014-02-19 09:59:39

标签: android listview

我在每行添加一个删除图像,因此当点击图像并删除此行时,以下代码为MyDapater:

public View getView(int position, View convertView, ViewGroup parent) {
    View view = null;
    LayoutInflater inflater = ((Activity) context).getLayoutInflater();

    if (convertView == null) {
        view = inflater.inflate(R.layout.row, null);
        ItemViewHolder holder = new ItemViewHolder();
        ...
        holder.deleteImage = (ImageView) view.findViewById(R.id.delete_icon);

        holder.deleteImage.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                int pos = (Integer)v.getTag();
                _list.remove(pos); // _list is a List storage the data
                notifyDataSetChanged();
            }

        });

        view.setTag(holder);
    } else {
        view = convertView;
    }
    ItemViewHolder holder = (ItemViewHolder) view.getTag();
    holder.deleteImage.setTag(Integer.valueOf(position));

    return view;
}

并且在Activity中,我的数据是存储一个List和以下代码:

adapter = new MyAdapter(this, _list);//
listView.setAdapter(adapter);

所以,当点击删除图片时,这一行就会出现。我的问题是:活动如何知道删除哪一行?

2 个答案:

答案 0 :(得分:1)

简而言之,它没有。

如果您希望活动知道哪些行被删除,您需要告诉它。我首选的方法是界面。

public interface DeleteListener{
    public void rowDeleted(int pos);
}

并且活动应该实现它

public class myActivity extends Activity implements DeleteListener{

创建适配器时传递活动参考

adapter = new MyAdapter(this, _list, this);

并在适配器中触发删除事件

public MyAdapter(Context context, List _list, DeleteListener dListener){
    //save the listener to a field
}
...
        @Override
        public void onClick(View v) {
            int pos = (Integer)v.getTag();
            _list.remove(pos); // _list is a List storage the data
            dListener.rowDeleted(pos);
            notifyDataSetChanged();
        }

答案 1 :(得分:0)

您可以在适配器构造函数中传递数据库对象,并在单击事件中从数据库中删除您的项目。