2012-04-12 110 views

回答

103

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如何重用。在适配器

+4

Convertview == null当所有itens遵循相同的布局时都是有用的。例如,当您需要检查收音机或选中的按钮时,并根据每个项目更改布局时,您需要重新填充或获取缓存视图。 – sagits 2015-04-16 14:30:41

+0

不需要过度充气。只需要在getview中写入switch或if-else梯形图并根据您的情况充气视图,重写public int getItemViewType(int position)和public int getViewTypeCount()。 @sagits – 2015-05-08 06:36:00

+0

如果语句通常有效,但是使用单选按钮,编辑文本以及使用缓存视图时遇到麻烦的这些内容,有关于堆栈溢出的一些问题。 – sagits 2015-05-08 17:13:55

9

你可以看看这个视频关于列表视图。它来自去年的Google IO,并且仍然是我心目中最好的列表视图。

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

  1. 它膨胀(您RES /布局/文件夹中的XML文件)的布局为Java对象如的LinearLayout和其他视图。

  2. 看看视频,会及时了解转换视图的使用情况,基本上它是一个等待您重复使用的回收视图,以避免创建新对象并放慢您的滚动名单。

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

4
  1. 布局充气膨胀/添加外部XML定义当前视图。

  2. getView()被调用多次,包括滚动时。因此,如果它已经有观点夸大了,我们不想再做一次,因为膨胀是一个昂贵的过程..这就是为什么我们检查它是否为空,然后膨胀它。

  3. 父视图是您的列表的单细胞..

+3

父视图在这里解释不正确。它将是ListView而不是ListItem – 2014-11-29 09:09:51

2

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; 
    } 

} 
1

getView()方法来创建新的ViewViewGroupListview或微调每一行。您可以在res/layout文件夹中定义此ViewViewGroup文件中的Layout XML文件,并可以将其引用到Adapter类Object。

如果在传递给适配器的数组中有4个项目。getView()方法将为4行Adaper创建4个视图。

LayoutInflater类有一个方法inflate(),它从XML资源布局创建视图对象。

61

getView()方法是用于产生的ListViewGallery项的视图,...

  1. LayoutInflater用于获取您在布局XML(根对象定义视图对象,通常是LinearLayoutFrameLayout,或RelativeLayout

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

  3. parentView是包含项目的视图,其中getView()生成的视图。通常它是ListView控件或画廊...

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

+2

对于parentView的优秀解释,找不到比这个更好的解释,+1 – 2013-12-17 10:27:56

+0

惊人的解释! – gabi 2015-09-19 14:22:46

+0

很好的解释+1 – tpk 2016-09-21 17:01:30

5

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。

希望这有助于:)

0

您也可以找到有关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); 
相关问题