文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android Adapter的几个常用方法

2022-06-06 07:27

关注

Android Adapter的几个常用方法分享给大家,具体内容如下

1  ListView是在什么时候设置对Adapter的数据监听的? 

在setAdapter(ListAdapter adapter)中,会先取消ListView中原来的mAdapter中的数据监听(mAdapter.unregisterDataSetObserver(mDataSetObserver);),然后再设置对新设置的adapter的数据监听。 

2  getView(int position, View convertView, ViewGroup parent) 

我们都知道mAdapter的getView方法很重要,那么该方法在ListView是怎么被利用的呢? 在ListView的源码中没有发现getView方法的调用,于是我们去ListView的父类AbsListView。在AbsListView中的obtainView中调用了getView,其主要代码逻辑部分为:


View obtainView(int position, boolean[] isScrap) {
    isScrap[0] = false;
    View scrapView;
    //从回收器中获取view
    scrapView = mRecycler.getScrapView(position);
    View child;
    if (scrapView != null) {
      ...
      //若不为空,则传入convertView,这样的话重用了view,同时更新了数据
      child = mAdapter.getView(position, scrapView, this);
      ...
    } else {
      //若为空,则在getView中重新创建HolderView,且填入数据
      child = mAdapter.getView(position, null, this);
      ...
    }
    return child;
  }

而obtainView又会在ListView的measure以及生成整个ListView等中用到。 

对于重写getView方法最终要的应该就是要记得convertView的重用了,没有重用几乎都会造成内存卸了。 

3  getCount() 

Adapter的getCount()用来干啥?  在ListView中,在onMeasure以及触控分发响应等过程中都会用到Adapter的getCount()函数。毫无疑问的是:它应该返回底层数据的数据个数。 

4  getItem(int position) 

getItem()在AdapterView中被调用,然后供用户调用:从这两个函数的描述我们可以看出,我们应该在Adapter的getItem()方法中返回position对应的数据,但是不是说一定要返回用于在Item的View上展示的数据,这个还是看需求,虽然可能大部分情况都是返回View中展示的数据。 


  
  public Object getItemAtPosition(int position) {
    T adapter = getAdapter();
    return (adapter == null || position < 0) ? null : adapter.getItem(position);
  }
  
  public Object getSelectedItem() {
    T adapter = getAdapter();
    int selection = getSelectedItemPosition();
    if (adapter != null && adapter.getCount() > 0 && selection >= 0) {
      return adapter.getItem(selection);
    } else {
      return null;
    }
  }

纵观整个结构,可以说存在这样的三层:dataLists(原底层数据)--Adapter--AdapterView,有了getItem()方法的存在,我们可以直接利用Adapter来获取数据,而不需要获取底层dataLists的引用;有了getItemAtPosition()方法的存在,我们可以直接利用AdapterView 获取底层数据,而不需要获取其Adapter的引用。这样的话,对于编程的简便性以及解耦性都好很多。

5    getItemId(int position) 

在AdapterView中发现它的一些调用,


public long getItemIdAtPosition(int position) {
    T adapter = getAdapter();
    return (adapter == null || position < 0) ? INVALID_ROW_ID : adapter.getItemId(position);
  }
  private void fireOnSelected() {
    if (mOnItemSelectedListener == null)
      return;
    int selection = this.getSelectedItemPosition();
    if (selection >= 0) {
      View v = getSelectedView();
      //这里调用的getItemId得到的返回值与selection都属于同一个item的特征,其意义也就在于在选择接口的onItemSelected方法中可
      //以直接拿到该item的id,而不需要通过获取adapter来间接实现
      mOnItemSelectedListener.onItemSelected(this, v, selection,
          getAdapter().getItemId(selection));
    } else {
      mOnItemSelectedListener.onNothingSelected(this);
    }
  }
  int findSyncPosition() {
    ...
      rowId = adapter.getItemId(seed);
      if (rowId == idToMatch) { //从这里来看,getItemId似乎应该对于不同的item返回不同的值,保持唯一性
        // Found it!
        return seed;
      }
    ...
  }

与上面分析的getItem()方法一样,getItemId()和getItemIdAtPosition()都提供了编程上面的便利。但是目前来看,由于对id没啥需求,所以大部分在重写getItemId方法时都是直接返回的position值,这样做也是对的,虽然从数据获取上没啥意义(我给你一个position,你原封不动的返回给我,啥意思)。但是我想说明的是,不要被这个做法所限制,而以为ItemId就是item在数据中的position。其实若有需求,可以利用getItemId()方法返回一些其他的值,比如每个item数据在数据库中id值,或者每个人的身份证号等。

您可能感兴趣的文章:android开发中ListView与Adapter使用要点介绍详解Android App中ViewPager使用PagerAdapter的方法Android中 自定义数据绑定适配器BaseAdapter的方法Android自定义Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现)Android listview与adapter详解及实例代码Android开发中ListView自定义adapter的封装Android中的Adapter简单介绍Android中GridView和ArrayAdapter用法实例分析Kotlin编写Android适配器AdapterAndroid ListView适配器(Adapter)优化方法详解Android开发中总结的Adapter工具类【附完整源码下载】


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯