当前位置: 移动技术网 > IT编程>移动开发>Android > Android Adapter的几个常用方法

Android Adapter的几个常用方法

2019年07月24日  | 移动技术网IT编程  | 我要评论

bt宝马,qq拼音生僻字,舰宗

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中展示的数据。 

  /**
   * gets the data associated with the specified position in the list.
   *
   * @param position which data to get
   * @return the data associated with the specified position in the list
   */
  public object getitematposition(int position) {
    t adapter = getadapter();
    return (adapter == null || position < 0) ? null : adapter.getitem(position);
  }
  
  /**
   * @return the data corresponding to the currently selected item, or
   * null if there is nothing selected.
   */
  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值,或者每个人的身份证号等。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网