如何操作内存的ListView
有很多的时候,我们需要对数据进行增加,删除,修改的操作,但是如果我们每次进行操作数据之后,为了及时,更新ListView上面的数据,
我们有2个做法,第一种:是操作数据库之后,然后再查询一次数据库,然后更新ListView上面的数据,(这里访问了2次数据库.比较不好)
第二种:是操作数据库之后,直接通知ListView,我刚才,做了什么操作,然后让ListView直接操作自己内存中的数据.(比第一种要好,在这里介绍一下)
一个核心
首先,对于ListView的操作,我们要知道一个核心
上面这张图片说明,一个ListView需要显示,
需要依赖adapter,一个adapter,又需要,data,和layout
.layout用来展示,data是来提供数据的.
所以,归根到底,一个ListView需要展示有多少条,是和个data的数据挂钩的.data有2条数据,listView就显示2条.data数据显示有3条,那么ListView就显示三条数据,
对于LiistView操作的这个核心就是:操作data,数据来源于集合,所以本质上就是操作集合
增加操作
BlcakListDao dao = new BlcakListDao(this);
List<BlackListInfo> infos = dao.query();//第一次查询所有数据出来.因为我们知道,adapter的显示的数据来源于list集合
//简化操作,就写核心代码了.
//假设我们把这么一条数据,插入数据库了.
BlackListBean info = new BlackListBean(blackNumber, type);
//为了提供用户的体验性,我在把数据插入到数据库之后,
//也应该及时的更新ListView上面的数据,展示给用户看
//在ListView的内存中加入一条数据
infos.add(info);//在infos集合中添加进,最新插入的数据.add(Object obj);该方法接受的就是一个obj对象
//然后通知ListView要刷新页面了
notifyDataSetChanged();//该方法是在adapter身上的
更新操作
在ListView里面更新数据,
一般的逻辑都是,先点击具体的条目,然后,把具体的数据带到下一个页面,然后更新了数据库的数据之后,把数据,返回来.
在做更新的逻辑的时候,要注意一点,就是你要更新那条条目的数据,就需要,把其position下标给记住。因为集合的更新,需要用到下标的。
现在代码演示一下
第一个activity
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
//拿到具体被点击条目的数据
BlackListInfo info = (BlackListInfo) infos.get(position);
Intent intent = new Intent(this, BlackListEditActivity.class);
//把数据带过去,让接受页面,进行更新操作
intent.putExtra("updateInfo", info);
//这需要把position带过去,因为,待会操作ListView的内存更新需要使用到
intent.putExtra("position", position);
startActivityForResult(intent, REQUESTCODE_UPDATE);
//REQUESTCODE_UPDATE自己定义的请求的状态码
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data == null) {//因为有可能用户不修改,直接点击返回键,进行判断防止空指针
return;
}
BlackListInfo info = (BlackListInfo) data.getSerializableExtra("info");
int position = (Integer) data.getSerializableExtra("position");
//通知ListView,修改内存中的数据,既然是修改,当然需要告诉ListView,修改谁的(position),新的数据是什么(info);所以,set()方法,就需要传递这个2个参数
infos.set(position, info);
//通知ListView更新条目.
blackAdapter.notifyDataSetChanged();//notifyDataSetChanged()数据是adapter里面的数据方法,要使用适配器来调用
}
//第二个activity
Intent intent =getIntent();
BlackListInfo
oldInfo= intent.getSerializableExtra("updateinfo");
BlcakListDao dao = new BlcakListDao(this);
dao.update(oldInfo.number,2);
BlackListInfo info = new BlackListInfo(oldInfo.number, 2);
intent.putExtra("info", info);//更新之后的实体
intent.putExtra("position", position);//该实体的位置,还是和之前一样.
setResult(101, intent);
删除操作
在ListView里面,点击删除操作。一般都是在adapter里面的getView方法里面直接写的,
因为里面就有position,方便了获取下标,进行删除
//告诉infos.
infos.remove(position);
//通知ListView,数据发生改变了,刷新一下界面
notifyDataSetChanged();
总结
其实操作ListView内存中的数据,其实就是操作,List集合添加,修改,移除.然后在使用 notifyDataSetChanged();
来通知更新.在javaCode里面,需要使用index下标来操作.现在只是变成了position.