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

我的问题是:

  1. LayoutInflater的function究竟是什么?
  2. 为什么我读过的所有文章检查convertview是否为空? 这是什么意思,当它是空的,这是什么意思,当它不是?
  3. 这个方法接受的父参数是什么?

1: LayoutInflater布局XML文件,并从其内容创build不同的View对象。

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

3:提供parent ,以便您可以将视图膨胀为正确的布局参数。

所有这些一起可以用来有效地创build将出现在您的列表(或其他视图,需要一个适配器)的视图:

 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

适配器中的getView()方法用于生成ListViewGallery ,…的项目视图…

  1. LayoutInflater用于获取您在布局xml(根对象,通常是LinearLayoutFrameLayoutRelativeLayout )中定义的View对象,

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

  3. parentView是包含getView()生成的项目视图的视图。 通常是ListView或Gallery …

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

你可以看看这个关于列表视图的video。 它从去年的谷歌IO,仍然是我脑海中最好的列表视图。

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

  1. 它将布局(res / layout /文件夹中的xml文件)膨胀成java对象(如LinearLayout和其他视图)。

  2. 看看video,会让你了解转换视图的使用情况,基本上它是一个等待你重复使用的回收视图,以避免创build一个新的对象,并放慢你的列表的滚动。

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

LayoutInflater的function究竟是什么?

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

为什么我读过的所有文章检查convertview是否为空? 这是什么意思,当它是空的,这是什么意思,当它不是?

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

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

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

父级是一个ViewGroup,你的视图通过getView()最终附加到ViewGroup。 现在在你的情况下,这将是ListView。

希望这可以帮助 :)

  1. 布局充气器膨胀/添加外部XML到您当前的视图。

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

  3. 父视图是List的单个单元格

LayoutInflater用于为ListView项目或片段的onCreateView生成XML的dynamic视图。

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()方法为Listview或Spinner的每一行创build新的ViewViewGroup 。 您可以在res/layout文件夹中的Layout XML文件中定义此ViewViewGroup ,并可以将其引用到Adapter类Object。

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

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

您还可以在Adapter.java文件的适配器接口中find有关getView的有用信息。 它说;

  /** * 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);