Android Adapter基本理解

时间:2023-12-04 21:18:44

感谢大佬:https://blog.csdn.net/l799069596/article/details/47301711

Android Adapter基本理解:

我的理解是:

1、一个有许多getter的类(就是getView(),getCount()....这些方法)

2、有多少个get方法?都是什么?

这些getter是特定的,你可以复写他们,全部的方法如下

Android Adapter基本理解

其中一般我们只用复写getCount(),getView(),getItemId(),getItem()这四个方法

3、这些被谁调用?

这些getter是被android系统自行调用的(具体如何调用,作为像我这样的新手做稍微了解就好)

4、为什么要复写这些get方法?

复写这些getter是为了返回给android系统,自己想给的结果

5、android系统通过这些getter能得到什么?

得到这个view自身的一些信息

eg:以ListView中的Adapter为例,其中

public int getCount()

返回ListView中要显示的子View数量,就是item的总数量

public Object getItem(int position)

返回一个子View,即ListView中的一个子条目

public long getItemId(int position)

返回一个item的id,由参数position决定是哪个id

public View getView(int position, View convertView, ViewGroupparent)

后做详解

….

6、android系统得到这些为了干什么?

得到这些信息以便绘制出这个View,以及以怎么样的方式绘制…

View getview(int position, View convertview, ViewGroup
parent )的理解:

引用自:http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html其中也有一案例帮助理解

一、原理的理解

工作原理:

  1. ListView 针对List中每个item,要求 adapter “给我一个视图” (getView)。
  2. 一个新的视图被返回并显示

如果我们有上亿个项目要显示怎么办?为每个项目创建一个新视图?NO!这不可能!

实际上Android为你缓存了视图。

Android中有个叫做Recycler的构件,下图是他的工作原理:

Android Adapter基本理解

  1. 如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在Recycler中。
  2. ListView先请求一个type1视图(getView)然后请求其他可见的项目。convertView在getView中是空(null)的。
  3. 当item1滚出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图。

二、代码的理解

Google官方的demo代码:


  1. <span style="font-family:Courier New;font-size:12px;">public View getView(int position, View convertView, ViewGroup parent)
  2. {
  3. // A ViewHolder keeps references to children views to avoid unneccessary calls
  4. // to findViewById() on each row.
  5. ViewHolder holder;
  6. // When convertView is not null, we can reuse it directly, there is no need
  7. // to reinflate it. We only inflate a new View when the convertView supplied
  8. // by ListView is null.
  9. if (convertView == null)
  10. {
  11. convertView = mInflater.inflate(R.layout.list_item_icon_text, null);
  12. Log.v("tag", "positon "+position+" convertView is null, "+"new: "+convertView);
  13. // Creates a ViewHolder and store references to the two children views
  14. // we want to bind data to.
  15. holder = new ViewHolder();
  16. holder.text = (TextView) convertView.findViewById(R.id.text);
  17. holder.icon = (ImageView) convertView.findViewById(R.id.icon);
  18. convertView.setTag(holder);
  19. }
  20. else
  21. {
  22. // Get the ViewHolder back to get fast access to the TextView
  23. // and the ImageView.
  24. holder = (ViewHolder) convertView.getTag();
  25. Log.v("tag", "positon "+position+" convertView is not null, "+convertView);
  26. }
  27. // Bind the data efficiently with the holder.
  28. holder.text.setText(DATA[position]);
  29. holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);
  30. return convertView;
  31. }
  32. static class ViewHolder
  33. {
  34. TextView text;
  35. ImageView icon;
  36. } </span>

下两段引用自:http://blog.csdn.net/pkxiuluo01/article/details/7380974

convertView参数的理解:

每次显示一个item都调用一次getview方法但是每次调用的时候covertview为空(因为还没有旧的view),当显示完了之后。如果屏幕移动了之后,并且导致有些Item(也可以说是view)跑到屏幕外面,此时如果还有新的item需要产生,则这些item显示时调用的getview方法中的convertview参数就不是null,而是那些移出屏幕的view(旧view),我们所要做的就是将需要显示的item填充到这些回收的view(旧view)中去,最后注意convertview为null的不仅仅是初始显示的那些item,还有一些是已经开始移入屏幕但是还没有view被回收的那些item。

setTag()和getTag()的理解:

view的setTag和getTag方法其实很简单,在实际编写代码的时候一个view不仅仅是为了显示一些字符串、图片,有时我们还需要他们携带一些其他的数据以便我们对该view的识别或者其他操作。于是android 的设计者们就创造了setTag(Object)方法来存放一些数据和view绑定,我们可以理解为这个是view 的标签也可以理解为view 作为一个容器存放了一些数据。而这些数据我们也可以通过getTag() 方法来取出来。

到这里setTag和getTag大家应该已经明白了。再回到上面的话题,我们通过convertview的setTag方法和getTag方法来将我们要显示的数据来绑定在convertview上。如果convertview 是第一次展示我们就创建新的Holder对象与之绑定,并在最后通过return convertview 返回,去显示;如果convertview 是回收来的那么我们就不必创建新的holder对象,只需要把原来的绑定的holder取出加上新的数据就行了。

我理解过程中所看的文章:

源头上理解Adapter,以及一个案例

http://blog.csdn.net/chunqiuwei/article/details/39934169

帮助理解

http://blog.csdn.net/primer_programer/article/details/23064767


补充:提醒大家在item中不要有像Button一样可以点击的空间,否则listView的OnItemClickListener的设置会无效的