我的问题是:创建自己的自定义适配器时,getView()方法如何工作?
- 什么是LayoutInflater的功能?
- 为什么我读过的所有文章检查convertview是否为null?它是什么意思,当它是空的,它不是什么意思?
- 此方法接受的父参数是什么?
我的问题是:创建自己的自定义适配器时,getView()方法如何工作?
1:该LayoutInflater
需要您的布局XML文件并从其内容创建不同的视图对象。
2:适配器构建为重用视图,当视图滚动以便不再可见时,它可用于出现的新视图之一。这个重用的视图是convertView
。如果这是空的,这意味着没有循环查看,我们必须创建一个新的,否则我们应该使用它来避免创建一个新的。
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;
}
注意使用LayoutInflater
,即parent
可以使用作为它的参数,以及convertView
如何重用。在适配器
你可以看看这个视频关于列表视图。它来自去年的Google IO,并且仍然是我心目中最好的列表视图。
http://www.youtube.com/watch?v=wDBM6wVEO70
它膨胀(您RES /布局/文件夹中的XML文件)的布局为Java对象如的LinearLayout和其他视图。
看看视频,会及时了解转换视图的使用情况,基本上它是一个等待您重复使用的回收视图,以避免创建新对象并放慢您的滚动名单。
允许您从适配器引用列表视图。
布局充气膨胀/添加外部XML定义当前视图。
getView()被调用多次,包括滚动时。因此,如果它已经有观点夸大了,我们不想再做一次,因为膨胀是一个昂贵的过程..这就是为什么我们检查它是否为空,然后膨胀它。
父视图是您的列表的单细胞..
父视图在这里解释不正确。它将是ListView而不是ListItem – 2014-11-29 09:09:51
LayoutInflater
用于产生用于ListView
项目或在片段的onCreateView
的XML的动态视图。
ConvertView
基本上用于回收当前不在视图中的视图。假设你有一个可滚动的ListView
。在向下滚动或向上滚动时,convertView
会显示滚动的视图。这种重复使用可以节省内存。
getView()
方法的父参数给出了具有listView的父布局的引用。假设你想在父XML的任何项目,你可以使用的Id:
ViewParent nv = parent.getParent();
while (nv != null) {
if (View.class.isInstance(nv)) {
final View button = ((View) nv).findViewById(R.id.remove);
if (button != null) {
// FOUND IT!
// do something, then break;
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.d("Remove", "Remove clicked");
((Button) button).setText("Hi");
}
});
}
break;
}
}
getView()
方法来创建新的View
或ViewGroup
为Listview
或微调每一行。您可以在res/layout
文件夹中定义此View
或ViewGroup
文件中的Layout XML
文件,并可以将其引用到Adapter
类Object。
如果在传递给适配器的数组中有4个项目。getView()
方法将为4行Adaper创建4个视图。
LayoutInflater类有一个方法inflate(),它从XML资源布局创建视图对象。
getView()
方法是用于产生的ListView
,Gallery
项的视图,...
LayoutInflater
用于获取您在布局XML(根对象定义视图对象,通常是LinearLayout
, FrameLayout
,或RelativeLayout
)
convertView
是用于回收。假设您有一次只能显示10个项目的列表视图,并且当前显示项目1 - >项目10的当前显示为 。当您向下滚动一个项目时,项目1的项目1将不在屏幕上,项目11将会被显示。为 生成项目11的视图,将调用getView()方法,并且 convertView
这里是项目1的视图(不再需要 )。因此,请为项目11创建一个新的查看对象(这是昂贵的 ),为什么不重新使用convertView
? =>我们只检查convertView
是否为 为空,如果为null则创建新视图,否则重新使用convertView
。
parentView
是包含项目的视图,其中getView()
生成的视图。通常它是ListView控件或画廊...
注意:你不直接调用此方法,只需要实现它来告诉父视图如何生成项目的看法。
LayoutInflater的功能究竟是什么?
当您使用XML进行设计时,您的所有UI元素都是标签和参数。在使用这些UI元素(例如TextView或LinearLayout)之前,您需要创建与这些xml元素对应的实际对象。这是充气器的用途。充气器使用这些标签及其相应参数来创建实际对象并设置所有参数。在此之后,您可以使用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。
希望这有助于:)
您也可以找到有关getView在Adapter.java文件适配器接口有用的信息。 它说;
/**
* 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);
Convertview == null当所有itens遵循相同的布局时都是有用的。例如,当您需要检查收音机或选中的按钮时,并根据每个项目更改布局时,您需要重新填充或获取缓存视图。 – sagits 2015-04-16 14:30:41
不需要过度充气。只需要在getview中写入switch或if-else梯形图并根据您的情况充气视图,重写public int getItemViewType(int position)和public int getViewTypeCount()。 @sagits – 2015-05-08 06:36:00
如果语句通常有效,但是使用单选按钮,编辑文本以及使用缓存视图时遇到麻烦的这些内容,有关于堆栈溢出的一些问题。 – sagits 2015-05-08 17:13:55