内存管理是应用程序开发的关键方面。由于移动设备的内存非常有限,因此有必要在我们的应用程序中谨慎使用它。这样做的最佳实践之一是“视图回收”。
本文介绍了Android中的视图回收,然后创建了一个简单的应用程序,该应用程序结合使用ListView和ArrayAdapter来实现视图回收的实践。
Android中的视图回收需求
一种实践是通过回收未使用的视图以显示新内容而不是为其创建新视图来使用尽可能少的内存。假设,我们正在向下滚动一千个单词的列表。如果我们为每个单词创建一个TextView ,则需要一千个TextView 。这将浪费大量内存,因为我们的设备屏幕一次仅显示7-8个TextView ,如果要查看其余的内容,我们需要向下滚动。
当我们向下滚动时,位于顶部的TextViews不再可见。因此,可以推断出,当用户向下滚动ListView时,顶部的TextView没有被用户使用。因此,未使用的TextView被回收并在用户向下滚动时在底部使用。这样,不用拥有一千个TextView ,仅用其中的几个就可以完成我们的任务。
Android中的视图回收示例
最常见的例子之一是我们手机的电话簿。我们的手机上可以有很多联系人,但是我们无需为每个联系人创建新的TextView ,而是仅回收未使用的向上/向下滚动视图,并用新的联系人信息填充它们,并在用户向上/向下滚动时再次显示。
使用ArrayAdapter和Listview实现视图回收
- ArrayAdapter是从BaseAdapter类扩展的Java公共类。 ArrayAdapter对象使要显示的数据适应数组。基本上,适配器是UI组件和数据之间的桥梁,有助于在UI组件中填充数据。
- ListView是从AbsListView扩展的Java公共类。 ListView是将多个项目分组并在垂直列表中显示它们的视图。如果无法在屏幕上容纳提供的数据量,此列表也会自动滚动。
- ArrayAdapter和ListView是视图回收所必需的。 ListView通过向其发送请求和指定位置来请求ArrayAdpapter的视图。然后,随着ListView不断询问它,直到设备的屏幕被填满,ArrayAdpapter会在指定位置返回该视图。现在,当用户向下滚动时,ListView将为ArrayAdpapter提供顶视图,这些顶视图不再显示在设备屏幕上。然后,ArrayAdpapter会擦除该ScrapView的先前数据并设置新数据,然后将其返回到ListView而不是创建新视图!
下面是一个简单的应用程序,用于演示内存管理的这种做法。
- 步骤1:将以下代码添加到activity_main.xml文件中,该文件仅包含ListView和TextView 。
activity_main.xml
MainActivity.java
package com.example.gfgrecycleview; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { public static final String LOG_TAG = MainActivity.class .getName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Create a list of study fields. ArrayList
stuff = new ArrayList<>(); stuff.add("Data Structures"); stuff.add("Algorithms"); stuff.add("Competitive Programming"); stuff.add("Interview Questions"); stuff.add("Python"); stuff.add("Java"); stuff.add("Designing"); stuff.add("Coding"); stuff.add("Developing"); stuff.add("Project Ideas"); stuff.add("C++"); stuff.add("Basically Everything!"); // Find a reference to the //{@link ListView} in the layout ListView itemListView = (ListView)findViewById(R.id.list); // Create a new {@link ArrayAdapter} // of study fields ArrayAdapter adapter = new ArrayAdapter ( this, android.R.layout.simple_list_item_1, stuff); // Set the adapter // on the {@link ListView} // so the list can be populated /// in the user interface itemListView.setAdapter(adapter); } }
输出:
- 步骤2:在下面的代码中,当我们初始化ArrayAdapter时,我们传递一个名为android.R.layout.simple_list_item_1的布局以及ArrayList和Context 。 android.R.layout.simple_list_item_1是一种内置布局,用于描述将在其中显示单个列表项的设计。它通常只包含一个TextView
初始化ListView和ArrayAdapter后,使用setAdapter()方法在ListView上设置ArrayAdapter。主要活动。Java
package com.example.gfgrecycleview; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { public static final String LOG_TAG = MainActivity.class .getName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Create a list of study fields. ArrayList
stuff = new ArrayList<>(); stuff.add("Data Structures"); stuff.add("Algorithms"); stuff.add("Competitive Programming"); stuff.add("Interview Questions"); stuff.add("Python"); stuff.add("Java"); stuff.add("Designing"); stuff.add("Coding"); stuff.add("Developing"); stuff.add("Project Ideas"); stuff.add("C++"); stuff.add("Basically Everything!"); // Find a reference to the //{@link ListView} in the layout ListView itemListView = (ListView)findViewById(R.id.list); // Create a new {@link ArrayAdapter} // of study fields ArrayAdapter adapter = new ArrayAdapter ( this, android.R.layout.simple_list_item_1, stuff); // Set the adapter // on the {@link ListView} // so the list can be populated /// in the user interface itemListView.setAdapter(adapter); } } 输出: