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

9wbgstp7  于 2023-09-29  发布在  Android
关注(0)|答案(9)|浏览(131)

我的问题是:

  1. LayoutInflater的功能到底是什么?
    1.为什么我读过的所有文章都先检查convertview是否为null?当它为null时意味着什么,当它不是null时意味着什么?
    1.此方法接受的父参数是什么?
nwsw7zdq

nwsw7zdq1#

1:LayoutInflater获取您的布局XML文件并从其内容创建不同的View对象。
2:适配器被构建为重用视图,当视图被滚动使得不再可见时,它可以用于出现的新视图之一。这个重用的视图就是convertView。如果这个值为null,这意味着没有回收的视图,我们必须创建一个新的,否则我们应该使用它来避免创建新的。
3:提供了parent,因此您可以将视图扩展到适当的布局参数。
所有这些都可以用来有效地创建将出现在列表中的视图(或其他需要适配器的视图):

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

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

oxcyiej7

oxcyiej72#

Adapter中的getView()方法用于生成ListViewGallery,...
1.**LayoutInflater用于获取在布局xml中定义的View对象(根对象,通常为LinearLayoutFrameLayoutRelativeLayout
1.
convertView用于回收。假设你有一个列表视图,一次只能显示10个项目,目前它正在显示项目1 ->项目10。当您向下滚动一个项目时,项目1将显示在屏幕外,而项目11将显示。要为项目11生成View,将调用getView()方法,这里的convertView是项目1的视图(不再需要)。因此,为项目11创建一个新的View对象(这是昂贵的),为什么不重用convertView呢?=>我们只是检查convertView是否为null,如果为null则创建新视图,否则重用convertView
1.
parentView**是ListView或Gallery...它包含getView()生成的项目视图。

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

yqkkidmi

yqkkidmi3#

你可以看看这个视频关于列表视图。它来自去年的谷歌IO,在我心目中仍然是列表视图中最好的演练。
http://www.youtube.com/watch?v=wDBM6wVEO70
1.它将布局(res/layout/文件夹中的xml文件)扩展到Java对象中,例如LinearLayout和其他视图。
1.看看这个视频,会让你了解到转换视图的最新用途,基本上它是一个回收的视图,等待你重复使用,以避免创建一个新的对象和减缓你的列表滚动。
1.允许您从适配器引用列表视图。

n53p2ov0

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。
希望这对你有帮助:)

9njqaruj

9njqaruj5#

1.布局充气器将外部XML充气/添加到当前视图。

  1. getView()被多次调用,包括滚动时。因此,如果它已经有视图膨胀,我们不想再做一次,因为膨胀是一个昂贵的过程..这就是为什么我们检查它是否为null,然后对其进行膨胀。
    1.父视图是列表的单个单元格。
cbeh67ev

cbeh67ev6#

LayoutInflater用于为ListView项或片段的onCreateView生成XML的动态视图。
ConvertView主要用于回收当前不在视图中的视图。假设你有一个可滚动的ListView。在向下或向上滚动时,convertView给出了滚动的视图。这种重用节省了内存。
getView()方法的parent参数提供了对具有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;
    }

 }
n9vozmp4

n9vozmp47#

getView()方法为Listview或Spinner的每一行创建新的ViewViewGroup。您可以在res/layout文件夹中的Layout XML文件中定义此ViewViewGroup,并可以给予其引用给Adapter类Object。
如果在传递给Adapter数组中有4个项目。getView()方法将为4行Adaper创建4个View。
LayoutInflater类有一个方法inflate(),它从XML资源布局创建视图对象。

tpgth1q7

tpgth1q78#

您还可以在Adapter.java文件中的Adapter界面中找到有关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);
4szc88ey

4szc88ey9#

如果你想把一个视图传递给一个函数(作为参数),你可以先定义一个元素,例如一个框架布局:

FrameLayout frameLayout = findViewById(R.id.frame_layout);

然后获取元素的视图:

frameLayout.getRootView();

相关问题