在创建自己的自定义适配器时,getView()方法如何工作?

Gro*_*Man 100 android android-arrayadapter layout-inflater android-view

我的问题是:

  1. LayoutInflater的功能究竟是什么?
  2. 为什么我读过的所有文章都会检查convertview是否为null?当它为空时它意味着什么?它不是什么意思?
  3. 此方法接受的父参数是什么?

Jav*_*ave 115

1:LayoutInflater获取布局XML文件并从其内容创建不同的View对象.

2:构建适配器以重用视图,当滚动视图使其不再可见时,它可用于出现的新视图之一.这个重用的View是convertView.如果这是null,则意味着没有回收的View,我们必须创建一个新的View,否则我们应该使用它来避免创建一个新的.

3:parent提供了这样,您可以将视图充气到适当的布局参数.

所有这些可以一起用于有效地创建将出现在列表中的视图(或带有适配器的其他视图):

public View getView (int position, View convertView, ViewGroup parent){
    if( convertView == null ){
        //We must create a View:
        convertView = inflater.inflate(R.layout.my_list_item, parent, false);
    }
    //Here we can do changes to the convertView, such as set a text on a TextView 
    //or an image on an ImageView.
    return convertView;
}
Run Code Online (Sandbox Code Playgroud)

注意使用LayoutInflater,parent可以用作它的参数,以及如何convertView重用.

  • 当所有的itens遵循相同的布局时,Convertview == null是有用的.例如,当您需要检查收音机或选中按钮,并根据每个项目更改布局时,您需要重新填充,或者获取缓存视图. (5认同)

Anh*_*uan 69

getView()在适配器的方法是,用于生成的项目的视图ListView,Gallery...

  1. LayoutInflater用于获取您在布局中的XML定义视图对象(根对象,通常是一个LinearLayout, FrameLayoutRelativeLayout)

  2. convertView是为了回收利用.假设您有一个列表视图,一次只能显示10个项目,目前显示项目1 - >项目10.当您向下滚动一个项目时,项目1将在屏幕外,项目11将显示.要为项目11生成View,将调用getView()方法, convertView这里是项目1的视图(不再需要).因此,为项目11创建一个新的View对象(这是昂贵的),为什么不重用convertView?=>我们只是检查是否convertView为null,如果null创建新视图,否则重复使用convertView.

  3. parentView是ListView或Gallery ...,它包含getView()生成的项目视图.

注意:您不直接调用此方法,只需要实现它以告诉父视图如何生成项目的视图.

  • 对于parentView的优秀解释,找不到比这个更好的解释,+ 1 (2认同)

erb*_*man 8

您可以查看有关列表视图的视频.它来自去年的谷歌IO,仍然是我心目中最好的列表视图.

http://www.youtube.com/watch?v=wDBM6wVEO70

  1. 它将布局(res/layout /文件夹中的xml文件)扩展为java对象,如LinearLayout和其他视图.

  2. 看一下视频,会让你了解转换视图的使用情况,基本上它是一个等待你重复使用的循环视图,以避免创建新对象并减慢列表的滚动速度.

  3. 允许您从适配器引用列表视图.


Shu*_*ayu 5

LayoutInflater的功能究竟是什么?

使用XML进行设计时,所有UI元素都只是标记和参数.在使用这些UI元素(例如TextView或LinearLayout)之前,需要创建与这些xml元素对应的实际对象.这就是inflater的用途.inflater使用这些标签及其相应的参数来创建实际对象并设置所有参数.在此之后,您可以使用findViewById()获取对UI元素的引用.

为什么我读过的所有文章都会检查convertview是否为null?当它为空时它意味着什么?它不是什么意思?

这是一个有趣的.你看,每次绘制列表中的项目时都会调用getView().现在,在绘制项目之前,必须创建它.现在convertView基本上是最后一个用于绘制项目的视图.在getView()中,首先对xml进行膨胀,然后使用findByViewID()来获取listitem的各种UI元素.当我们检查(convertView == null)时,我们要做的是检查视图是否为空(对于第一项)然后创建它,否则,如果它已经存在,重用它,不需要再次通过膨胀过程.使它更有效率.

您还必须在getView()中遇到ViewHolder的概念.这使列表更有效.我们所做的是创建一个视图,并存储我们在充气后获得的所有UI元素的引用.这样,我们可以避免调用众多的findByViewId()并节省大量时间.此ViewHolder在(convertView == null)条件下创建,并使用setTag()存储在convertView中.在else循环中,我们只需使用getView()获取它并重用它.

此方法接受的父参数是什么?

父级是最终附加了getView()创建的视图的ViewGroup.现在在你的情况下,这将是ListView.

希望这可以帮助 :)