adapter数据源与更新机制

在调用adapter的notifydatasetchanged更新列表组件时候,实际上就是调用adpater的getView方法重新获取页面的各个元素的过程,因为调用notify的时候,填充页面的list数据源往往发生了变化,那么getView得到的数据也就不一样了,所以界面就会发生改变。例如,我定义一个apater类:

public class MyAdapter extends BaseAdapter
{
    Context context;
    List<Pojo> pojos;
public MyAdapter(Context context,List<Pojo> pojos){
   this.context = context;
   this.pojos = pojos;
}
@Overrideprivate getView(){}
}

这时候我在activity里传入一个list,OK没错,每当我传入的list放生改变的时候,调用notify刷新都没有错。

但是最近做工程的时候,我创建了一个nodetree类,为了方便,在adaper里使用的是nodetree的nodes的list,看代码

public class Nodetree extends LinearLayout{

    public List<Node> nodes = new ArrayList<Node>;
    .....

}
public class MyAdapter extends BaseAdapter
{
    Context context;
    List<Node> nodes;
    NodeTree tree;
public MyAdapter(Context context,List<Node> nodes,NodeTree tree){
   this.context = context;
   this.tree = tree;
   this.nodes = tree.nodes;
}
@Override
private getView(){
}
}

然后,我再nodeTree里边对list进行增删改查,然后通知adapter刷新,理论上应该没问题,但是删除时候却出现了问题,界面不刷新!没办法,最后只得将数据的形式重新改为了一图所示的格式,即数据源直接放在adapter里边,刷新是肯定没有问题的,而且这样做的耦合性会好很多。

第二,再来学习一下刷新单个列表项的方法吧,虽然目前为止还没有用到,但是难保将来不会用到,未雨绸缪,当然是极好的。

其实,单条刷新机制的核心就是如何找到自己要更新的item,并手动调用getview去更新。

adpter类,很简单,就是利用一个convertview

public class MyAdapter extends BaseAdapter {

    Context context;
    List<String> names;
    public MyAdapter(Context context,List<String> names){
        this.context = context;
        this.names = names;
    }
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return names.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return names.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        String name = names.get(position);
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.single_refresh, parent, false);//设置为true会报addview isnot supported in adapterView,男人不能有孩子啦
        }
        ((TextView)convertView).setText(name);
        return convertView;
    }

}

然后在activity中写了一个refresh类,手动刷新需要更新的数据,这里需要用到几个平时不怎么见到的方法

public class MainActivity extends Activity {

    private ListView namesListView;
    private MyAdapter adapter;
    private List<String> names;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        names = new ArrayList<String>();
        names.add("小李");
        names.add("小刚");
        names.add("小明");
        names.add("小花");
        names.add("小红");
        names.add("小兰");
        namesListView = (ListView) findViewById(R.id.nameList);
        adapter = new MyAdapter(this, names);
        namesListView.setAdapter(adapter);
    }
    private void singleRefresh(int id){
        if (namesListView != null) {
            int start = namesListView.getFirstVisiblePosition();
            int end = namesListView.getLastVisiblePosition();
            for (int i = start; i < end; i++) {
                if (id == namesListView.getItemIdAtPosition(i)) {
                    TextView view = (TextView) namesListView.getChildAt(i-start);//不能addview,却依然可以有孩子
                    names.set(i, "我变身超级赛亚人啦!");
                    adapter.getView(i, view, null);
                    //adapter.getView(i, view, namesListView);也可以
                    break;
                }
            }
        }
    }
    public void refresh(View v){
        singleRefresh(0);
    }
}

需要注意:在ListView中,使用getChildAt(index)的取值,只能是当前可见区域(列表可滚动)的子项!

即取值在  ListView.getFirstVisiblePosition()~ListView.getLastVisiblePosition()之间

时间: 2024-10-08 22:37:04

adapter数据源与更新机制的相关文章

百度搜索引擎中的快照及快照更新机制

百度搜索引擎中的快照及快照更新机制 1.什么是百度快照? 如果无法打开某个搜索结果,或者打开速度特别慢,该怎么办?“百度快照”能帮您解决问题.每个被收录的网页,在百度上都存有一个纯文本的备份,称为“百度快照”.百度速度较快,您可以通过“快照”快速浏览页面内容. 不过,百度只保留文本内容,所以,那些图片.音乐等非文本信息,快照页面还是直接从原网页调用.如果您无法连接原网页,那么快照上的图片等非文本内容,会无法显示.所以,针对一些关闭掉或者无法访问的网站,如果想看到部分内容是可以通过百度快照实现的哦

app version updates must utilize the iOS built-in update mechanism(app的更新必须用iOS内置的更新机制)

今天有一个app审核被拒了,提示app里面包括了一个更新按钮,而app的更新必须用IOS的内置更新机制,而不是app里面含有更新视图 苹果的审核规则随时都会变,好吧,那就去掉了,重新打包上传审核

关于微信小程序更新机制

1)小程序的启动方式: 冷启动----小程序首次打开或销毁后再次被打开 热启动----小程序打开后,在一段时间内(目前:5分钟)再次被打开,此时会将后台的小程序切换到前台. 2)根据以上两种启动方式,相应的更新机制为: 小程序冷启动时,会检查小程序是否有最新版本.如果有则将异步下载最新版本,但是仍将运行当前版本等到下一次冷启动时再运行最新版本. 如果你想现在就使用最新版本则需要调用wx.getUpdateManager API进行处理: 3)关于wx.getUpdateManager实战使用 3

【React 6/100】 React原理 | setState | JSX语法转换 | 组件更新机制

****关键字 | setState | JSX语法转换 | 组件更新机制 组件更新机制 setState() 的两个作用 修改state 更新组件 过程:父组件重新渲染时,也会重新渲染子组件,但只会渲染当前组件子树(当前组件以其所有子组件) 组件性能优化 减轻state 减轻state:只存储跟组件渲染相关的数据(比如:count/ 列表数据 /loading等) 注意:不用做渲染的数据不要放在state中 对于这种需要在多个方法中用到的数据,应该放到this中 避免不必要的重新渲染 组件更新

开源一个适用iOS的数据库表结构更新机制的代码

将前段时间开源的代码,发布一下: ARDBConfig On the iOS, provide a database table structure update mechanism, ensure that the user in any version of the installer, the database structure to ensure adapter. (在iOS上,提供一个数据库表结构更新的机制,保证用户无论从哪个版本安装程序,数据库结构保证适配.) 如:用户A的数据库版

关于android的UI更新机制与误区

Android系统的消息队列和消息循环都是主线程的,其它后台服务等无法直接更新,必须通过下面的消息队列,由主线程的消息循环去依次执行更新ui: 同时对于费时间超过5秒的事件,比如网络链接等,建议新开线程处理,否则系统会提示用户终止你. 扩招知识: Android系统的消息队列和消息循环都是针对具体线程的,一个线程可以存在(当然也可以不存在)一个消息队列(Message Queue)和一个消息循环(Looper).Android中除了UI线程(主线程),创建的工作线程默认是没有消息循环和消息队列的

MFC的UI更新机制和加速键的创建

近期在看<MFC Windows程序设计>这本书,正好看到更新菜单中的菜单项和加入菜单项的加速键这方面的内容,下面总一下总结. MFC提供的更新菜单项的机制例如以下: 通过消息映射表中的ON_UPDATE_COMMAND_UI宏.能够给单个的菜单项分配选中的成员函数作为更新处理函数,当用户点中一个下拉菜单时,MFC捕获随之发生的WM_INITMENUPOPUP消息,并调用菜单中的全部菜单项的更新处理函数. 每一个更新处理函数获得一个指向CCmdUI对象的指针,并利用该对象的成员处理函数更新菜单

Android 时间更新机制之网络更新时间

转载请注明出处:http://blog.csdn.net/droyon/article/details/45701257 综述:Android网络时间更新,大体分两类.1.moderm相关更新,2.网络更新.本次主要介绍网路更新时间,主要涉及到NetworkTimeUpdateService,该类运行在SystemServer(ActivityManagerService)进程中.它有点特殊,从名字来看,其实Service,其实它和WifiService.ConnectivityManagerS

Android实现类似ListView模式的回收和更新机制的瀑布流

博客地址:http://blog.csdn.net/u010593680/article/details/43771857(转载请保留原文地址) 项目地址:https://git.oschina.net/0-0Xuan/XWaterFall 分析问题: 在做项目中遇到了需要使用瀑布流的情况,于是便和往常一样使用ScroollView模式的瀑布流,但是瀑布流效果容易实现,可一旦加载大量图片,则一不了心就内存溢出了,而瀑布流往往需要添加大量的图片,内存管理可以说是必要之举,那么问题就来了,如何在瀑布