第十七个项目——使用接口回调实现删除ListView列表中的Item数据
Last updated
Was this helpful?
Last updated
Was this helpful?
掌握如何删除ListView列表中的Item;
掌握如何使用接口回调在不同组件进行通信的方式;
掌握使用接口回调在不同组件进行通信的方式;
在中使用SwipeRefreshLayout为新闻列表页面增加了下拉刷新数据功能。实际工程项目中,在列表页面通常提供了删除某一Item数据的功能,本实验中通过在NewsAdapter中自定义名为OnItemDeleteListener接口,并通过接口回调的方式在MainActivity活动中实现删除指定id的新闻Item。
实现删除指定 id 的新闻 Item 的逻辑主要为:
在NewsAdapter中定义声明OnItemDeleteListener接口;
在NewsAdapter中实例化OnItemDeleteListener接口对象;
通过定义setOnItemDeleteListener()方法将OnItemDeleteListener接口对象给其他组件(本项目中是MainActivity);
在NewsAdapter.getView()方法中设置ImageView控件(id为iv_ delete) OnClick事件侦听器,并重写onClick()方法,在该方法中调用NewsAdapter中实例化的OnItemDeletedListener接口对象中的onDelete()方法;
在MainActivity中实现OnItemDeleteListener接口,并重写onDelete()方法,在该方法中实现删除指定id新闻Item的功能;
1. 定义OnItemDeleteListener接口
在NewsAdapter类内定义OnItemDeleteListener接口类型,接口中声明一个onDelete(int id)抽象方法,其他组件实现接口时必须重写该方法。
2. 实现setOnItemDeleteListener()方法
NewsAdapter需要为其他组件提供设置OnItemDeleteListener接口对象的方法,在NewsAdapter中定义setOnItemDeleteListener()方法,该方法的参数为OnItemDeleteListener接口类型,这从其他组件实例化后传递进来的接口对象。
上述两步的代码如下所示。
3. 更新ViewHolder类声明
4. 更新getView()方法
在NewsAdapter.getView()方法中,首先绑定iv_ delete控件至ViewHolder的 ivDelete成员变量。并通过viewHolder.ivDelete.setTag(position)方法将当前Item的索引值保存起来,以便在该ivDelete控件对象OnClick事件触发时取出。
最后通过viewHolder.ivDelete.setOnClickListener()方法设置ivDelete控件对象的OnClick事件侦听器,在onClick方法中,首先判断listener对象(为OnItemDeleteListener接口对象)是否为空,如果不为空则直接调用其onDelete()方法。当其他组件通过调用NewsAdapter.setOnItemDeleteListener()方法设置了OnItemDelete侦听器时,相应的侦听器对象的onDelete()方法将被执行,从而实现删除指定id新闻Item的操作,具体代码如下所示。
1. 设置NewsAdapter对象的OnItemDelete事件侦听器
在MainActivity活动的onCreate()方法中,实例化NewsAdapter对象后,通过setOnItemDeleteListener()方法设置OnItemDelete事件侦听器,传递的参数为匿名类接口。在重写匿名类接口的onDelete(int id)方法时,调用MainActivity类定义的私有方法removeData(int id),实际删除功能由该方法实现。
2. 定义removeData()方法实现删除指定 id 新闻Item
在本次实验中,删除指定id新闻的Item功能放在removeDta()方法中。在该方法中,通过调用newsList.remove(int id)方法删除指定id下标的数据,并调用NewsAdapter的notifyDataSetChanged()方法通知绑定适配器的ListView控件刷新数据,从而完成删除指定id新闻Item操作。
上述两步的代码具体如下所示。
通过本次实验,你应该掌握了如下知识内容:
使用接口回调实现组件间通信;
使用接口回调实现删除ListView指定id新闻Item;
打开或,在此基础上完成本次实验。
在list_ item.xml布局中,需要加入相应用户点击删除操作的ImageView控件(id为iv_delete),代码如下所示。 其中使用layout_ alignParentEnd,layout_ below两个属性将ImageView控件放在布局的右下角。 ImageView控件的图片使用了Vector asset资源,通过右击项目【res】->【Vector Asset】弹出**Vector Asset对话框进行选择,如所示。
如果在的基础上进行实验,则需要更新ViewHolder类声明,添加一个名为ivDelete的ImageView控件对象,用于绑定list_ item.xml布局中的iv_ delete控件,具体代码如下所示。
编译本项目,成功后在AVD上或物理机上运行App,初始化时,ListView显示近20条新闻列表,你可通过下拉刷新新增新闻(该功能在中实现),通过点击每条新闻右下方的删除图标可删除当前新闻Item,运行效果如所示。