public View getView(int position, @Nullable 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;
}
/**
* Get a View that displays the data at the specified position in the data set. You can either
* create a View manually or inflate it from an XML layout file. When the View is inflated, the
* parent View (GridView, ListView...) will apply default layout parameters unless you use
* {@link android.view.LayoutInflater#inflate(int, android.view.ViewGroup, boolean)}
* to specify a root view and to prevent attachment to the root.
*
* @param position The position of the item within the adapter's data set of the item whose view
* we want.
* @param convertView The old view to reuse, if possible. Note: You should check that this view
* is non-null and of an appropriate type before using. If it is not possible to convert
* this view to display the correct data, this method can create a new view.
* Heterogeneous lists can specify their number of view types, so that this View is
* always of the right type (see {@link #getViewTypeCount()} and
* {@link #getItemViewType(int)}).
* @param parent The parent that this view will eventually be attached to
* @return A View corresponding to the data at the specified position.
*/
View getView(int position, View convertView, ViewGroup parent);
9条答案
按热度按时间nwsw7zdq1#
1:
LayoutInflater
获取您的布局XML文件并从其内容创建不同的View对象。2:适配器被构建为重用视图,当视图被滚动使得不再可见时,它可以用于出现的新视图之一。这个重用的视图就是
convertView
。如果这个值为null,这意味着没有回收的视图,我们必须创建一个新的,否则我们应该使用它来避免创建新的。3:提供了
parent
,因此您可以将视图扩展到适当的布局参数。所有这些都可以用来有效地创建将出现在列表中的视图(或其他需要适配器的视图):
注意
LayoutInflater
的使用,parent
可以用作它的参数,以及convertView
是如何重用的。oxcyiej72#
Adapter中的
getView()
方法用于生成ListView
,Gallery
,...1.**
LayoutInflater
用于获取在布局xml中定义的View对象(根对象,通常为LinearLayout
、FrameLayout
或RelativeLayout
)1.
convertView
用于回收。假设你有一个列表视图,一次只能显示10个项目,目前它正在显示项目1 ->项目10。当您向下滚动一个项目时,项目1将显示在屏幕外,而项目11将显示。要为项目11生成View,将调用getView()
方法,这里的convertView
是项目1的视图(不再需要)。因此,为项目11创建一个新的View对象(这是昂贵的),为什么不重用convertView
呢?=>我们只是检查convertView
是否为null,如果为null则创建新视图,否则重用convertView
。1.
parentView
**是ListView或Gallery...它包含getView()
生成的项目视图。注意:不直接调用此方法,只需要实现它来告诉父视图如何生成项目的视图即可。
yqkkidmi3#
你可以看看这个视频关于列表视图。它来自去年的谷歌IO,在我心目中仍然是列表视图中最好的演练。
http://www.youtube.com/watch?v=wDBM6wVEO70
1.它将布局(res/layout/文件夹中的xml文件)扩展到Java对象中,例如LinearLayout和其他视图。
1.看看这个视频,会让你了解到转换视图的最新用途,基本上它是一个回收的视图,等待你重复使用,以避免创建一个新的对象和减缓你的列表滚动。
1.允许您从适配器引用列表视图。
n53p2ov04#
LayoutInflater的功能到底是什么?
当您使用XML进行设计时,所有的UI元素都只是标记和参数。在使用这些UI元素(例如TextView或LinearLayout)之前,您需要创建与这些xml元素相对应的实际对象。这就是充气机的作用。充气器使用这些标签及其相应的参数来创建实际对象并设置所有参数。在此之后,您可以使用findViewById()获取对UI元素的引用。
为什么我读过的所有文章都先检查convertview是否为null?当它为null时意味着什么,当它不是null时意味着什么?
这是一个有趣的问题。您可以看到,每次绘制列表中的一个项时都会调用getView()。现在,在可以绘制项目之前,必须创建它。现在convertView基本上是最后一个用来绘制项目的视图。在getView()中,首先膨胀xml,然后使用findByViewID()获取列表项的各种UI元素。当我们检查(convertView == null)时,我们所做的就是检查如果一个视图为null(对于第一个项目),那么就创建它,否则,如果它已经存在,就重用它,不需要再次经历膨胀过程。这样效率更高。
您还必须在getView()中遇到ViewHolder的概念。这使得列表更有效率。我们所做的是创建一个viewholder并存储对膨胀后获得的所有UI元素的引用。这样,我们就可以避免调用大量的findByViewId(),保存大量的时间。这个ViewHolder是在(convertView == null)条件下创建的,并使用setTag()存储在convertView中。在else循环中,我们只是使用getView()获取它并重用它。
此方法接受的父参数是什么?
父视图是一个ViewGroup,由getView()创建的视图最终将附加到该ViewGroup。现在在你的例子中,这将是ListView。
希望这对你有帮助:)
9njqaruj5#
1.布局充气器将外部XML充气/添加到当前视图。
1.父视图是列表的单个单元格。
cbeh67ev6#
LayoutInflater
用于为ListView
项或片段的onCreateView
生成XML的动态视图。ConvertView
主要用于回收当前不在视图中的视图。假设你有一个可滚动的ListView
。在向下或向上滚动时,convertView
给出了滚动的视图。这种重用节省了内存。getView()
方法的parent参数提供了对具有listView的父布局的引用。假设您想获取父XML中任何可以使用的项目的ID:n9vozmp47#
getView()
方法为Listview
或Spinner的每一行创建新的View
或ViewGroup
。您可以在res/layout
文件夹中的Layout XML
文件中定义此View
或ViewGroup
,并可以给予其引用给Adapter
类Object。如果在传递给Adapter数组中有4个项目。
getView()
方法将为4行Adaper创建4个View。LayoutInflater类有一个方法inflate(),它从XML资源布局创建视图对象。
tpgth1q78#
您还可以在Adapter.java文件中的Adapter界面中找到有关getView的有用信息。
4szc88ey9#
如果你想把一个视图传递给一个函数(作为参数),你可以先定义一个元素,例如一个框架布局:
然后获取元素的视图: