android的adapter能不能在onResume方法中创建
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android的adapter能不能在onResume方法中创建相关的知识,希望对你有一定的参考价值。
点击listView的item进入修改数据后,返回到listview,数据不更新,但是把adapter的创建放到onResume方法中之后,按返回键回到listview界面数据就更新了,为什么啊?adapter能不能在onResume方法中创建?
在onResume方法中调用notifyDataSetChanged没有用
Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。
1.如下图直观的表达了Data、Adapter、View三者的关系:
android中所有的Adapter一览:
由图可以看到在Android中与Adapter有关的所有接口、类的完整层级图。在我们使用过程中可以根据自己的需求实现接口或者继承类进行一定的扩展。比较常用的有 Base Adapter,Impleader,Adapter,Counteradaptation等。
BaseAdapter是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性;
ArrayAdapter支持泛型操作,最为简单,只能展示一行字。
SimpleAdapter有最好的扩充性,可以自定义出各种效果。
SimpleCursorAdapter可以适用于简单的纯文字型ListView,它需要Cursor的字段和UI的id对应起来。如需要实现更复杂的UI也可以重写其他方法。可以认为是SimpleAdapter对数据库的简单结合,可以方便地把数据库的内容以列表的形式展示出来。
2.Adapter的方法
1.下面将对Adapter代码,做详细的解释,listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listView的长度,然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,列表将不显示同样return 1,就只显示一行。
2.系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的布局。
当了解了Adapter是怎么工作以后,你会发现Adapter的创建其实与Activity的生命周期无关
也就是说,你在onResume 创建和刷新都是没有问题的,当你调用adapter.notifyDataSetChanged() 方法后,android系统会刷新一下列表,实际上就是重新调用了一次adapter的 getView() ,即重新绘制每一行数据
有关adapter的机制,及更多用法,建议查看官方API文档
参考技术A 在修改完成的地方马上调用notifyDataSetChanged 参考技术B 在onResume()方法调用myAdapter.notifyDataSetChanged();试试追问试过了,不行
追答能把你的代码片段贴出来看看么,更新数据那部分
追问不方便,就是listview的每个item显示的是一个edittext的内容,点击item打开一个页面可以修改edittext的值,修改完成后,按返回键回到listview界面,如果是内容改变(比如1变成2),这样是显示的,但是如果给改成一个“”(空字符),按返回键回到listview界面显示的还是以前的内容,按理说是要没有内容才对
追答如果你点击listView的某一项会打开另一个界面,不管它是activity还是dialog,你肯定是从listView获取了它当前显示的内容(比如1),然后修改这个值(比如改成2),然后在你关闭这个activity或者dialog的时候,你有没有把你修改的值回传给listView的item项啊?
追问传了,不然不会变成2就可以显示啊,现在就是改变值是可以的,但是设成“”空就不行了
追答明白你的意思了。
如果你回传的是个字符串mString。
你回传的方法里有没有
if(mString == null || "".equals(mString)) 就特殊处理了?
如果程序可以运行,你debug跟踪下,或者Log输出下看看mString是不是“”空字符串
设计模式之四:适配器模式(Adapter Pattern)
在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。如果能既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?这就是适配器模式要解决的问题。
目的:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
下面以日志记录程序为例子说明Adapter模式。假设我们在软件开发中要记录日志,包括数据库记录日志DatabaseLog和文本文件记录日志WriteLog.现有日志接口为:
类图实现:
public abstract class Log
{
public abstract void WriteLog();
}
public class DatabaseLog : Log
{
public override void WirteLog()
{
Console.WriteLine("called database log");
}
}
public class FileLog : Log
{
public override void WirteLog()
{
Console.WriteLine("called File log");
}
}
但是开发过程需要引入一个新的日志接口,但新的日志接口和以前的不一样,该接口如下:public interface Ilog
{
void Write();
}
由于前后两个接口都不能修改,那么如何来适配前后两种情况,从而使原来的对象适应新的接口呢?
其实有两种思路:一个是类适配模式,另一个对象适配模式。类适配模式是通过类的继承机制来实现,而对象适配机制通过对象的组合来实现。
1.类适配模式类图实现:
具体实现为:
public class DatabaseLogAdapter : DatabaseLog, Ilog
{
public void Write()
{
this.WirteLog();
}
}
public class FileLogAdapter : FileLog, Ilog
{
public void Write()
{
this.WirteLog();
}
}
- 对象适配模式实现类图:
代码实现:
//对象适配
public class LogAdapter : Ilog
{
private Log log;
public LogAdapter(Log log)
{
this.log = log;
}
public void Write()
{
log.WriteLog();
}
}
上两种适配方式,可以看出在类适配方式中,是通过类的继承来实现的,同时也具有接口ILog的所有行为,这些就违背了面向对象设计原则中的类的单一职责原则,而对象适配器则是通过对象组合的方式来实现的,则符合面向对象的精神,所以推荐用对象适配的模式。
实现要点:
- Adapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在代码复用,类库迁移等方面非常有用。
- Adapter模式有对象适配器和类适配器两种形式的实现结构,但是类适配器采用“多继承”的实现方式,带来了不良的高耦合,而对象适配器采用“对象组合”的方式,更符合松耦合。
- Adapter模式本身要求我们尽可能的使用“面向接口编程”风格,这样才能在后期很方便的适配。
以上是关于android的adapter能不能在onResume方法中创建的主要内容,如果未能解决你的问题,请参考以下文章
android listview里面能嵌套gridview吗
android listview不能刷新 adapter.notifyDataSetChanged()和setListAdapter(myAdapter)都不好用