本文将构建一个应用程序,以演示GridView中CustomArrayAdapters的用法。 GridViews是视图容器,以二维(行和列)显示视图,它们在我的android应用程序中使用,一个简单的示例就是gallery应用程序。适配器将UI元素与数据源连接起来,它有助于我们照顾好数据。例如,当用户滚动图库应用程序时,将自动填充GridView而无需指定任何内容。有几种不同的适配器。
- 阵列适配器
- BaseAdapter
- 自定义ArrayAdapter
本文将介绍Custom ArrayAdapter。
为什么要使用自定义ArrayAdapter?
Android已经提供了ArrayAdapter的实现,仅可用于下面演示的一行。只要有单个项目的列表,便可以使用ArrayAdapter来使用它们。例如,电话联系人,国家/地区或姓名的列表。以下是用于显示文本数据的ArrayAdapter的语法。
Syntax:
ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)
Parameters:
Context: is the application context being used
resource: The second parameter is resource id used to set the layout(xml file).
textViewResourceId: Id of the TextView element where the data will be displayed
objects: are the data elements stored in an array.
这种方法的问题或局限性,我们不能使用复杂的布局,例如。想象我们正在构建一个像Netflix或prime这样的应用程序,其中每个元素都由许多元素组成,例如ImageView,TextView等。使用ArrayAddapter的简单实现就不可能实现这种复杂的视图,为此,我们需要通过以下方式创建自定义适配器扩展ArrayAdapter类。以下代码显示了自定义ArrayAdapter的结构。
Java
public class CustomAdapter extends ArrayAdapter
{
public CustomAdapter(Context context, int resource, List objects)
{
super(context, resource, objects);
}
@Override public int getCount()
{
return super.getCount();
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
return super.getView(position, convertView, parent);
}
}
XML
XML
Java
public class items
{
private int image_id;
private String text;
public int getImage_id()
{
return image_id;
}
public void setImage_id(int image_id)
{
this.image_id = image_id;
}
public String getText()
{
return text;
}
public void setText(String text)
{
this.text = text;
}
items(int img, String text)
{
image_id = img;
this.text = text;
}
}
Java
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent)
{
View v = convertView;
if (v == null) {
// getting reference to the main layout and
// initializing
LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(custom_layout_id, null);
}
// initializing the imageview and textview
// and setting data
ImageView imageView = v.findViewById(R.id.imageView);
TextView textView = v.findViewById(R.id.textView);
// get the item using the position param
items item = items_list.get(position);
imageView.setImageResource(item.getImage_id());
textView.setText(item.getText());
return v;
}
Java
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
public class CustomAdapter extends ArrayAdapter {
List items_list = new ArrayList<>();
int custom_layout_id;
public CustomAdapter(@NonNull Context context, int resource, @NonNull List objects) {
super(context, resource, objects);
items_list = objects;
custom_layout_id = resource;
}
@Override
public int getCount() {
return items_list.size();
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View v = convertView;
if (v == null) {
// getting reference to the main layout and
// initializing
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(custom_layout_id, null);
}
// initializing the imageview and textview and
// setting data
ImageView imageView = v.findViewById(R.id.imageView);
TextView textView = v.findViewById(R.id.textView);
// get the item using the position param
items item = items_list.get(position);
imageView.setImageResource(item.getImage_id());
textView.setText(item.getText());
return v;
}
}
Java
List itemsList = new ArrayList<>();
itemsList.add(new items(R.drawable.android_1, "image_1"));
itemsList.add(new items(R.drawable.android_2, "image_2"));
itemsList.add(new items(R.drawable.android_3, "image_3"));
itemsList.add(new items(R.drawable.android_4, "image_4"));
itemsList.add(new items(R.drawable.android_5, "image_5"));
itemsList.add(new items(R.drawable.android_1, "image_6"));
itemsList.add(new items(R.drawable.android_2, "image_7"));
itemsList.add(new items(R.drawable.android_3, "image_8"));
itemsList.add(new items(R.drawable.android_4, "image_9"));
itemsList.add(new items(R.drawable.android_5, "image_10"));
Java
GridView gridView = findViewById(R.id.grid_view);
CustomAdapter customAdapter = new CustomAdapter(this, R.layout.custom_view, itemsList);
gridView.setAdapter(customAdapter);
Java
import android.os.Bundle;
import android.widget.GridView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List itemsList = new ArrayList<>();
itemsList.add(new items(R.drawable.android_1, "image_1"));
itemsList.add(new items(R.drawable.android_2, "image_2"));
itemsList.add(new items(R.drawable.android_3, "image_3"));
itemsList.add(new items(R.drawable.android_4, "image_4"));
itemsList.add(new items(R.drawable.android_5, "image_5"));
itemsList.add(new items(R.drawable.android_1, "image_6"));
itemsList.add(new items(R.drawable.android_2, "image_7"));
itemsList.add(new items(R.drawable.android_3, "image_8"));
itemsList.add(new items(R.drawable.android_4, "image_9"));
itemsList.add(new items(R.drawable.android_5, "image_10"));
GridView gridView = findViewById(R.id.grid_view);
CustomAdapter customAdapter = new CustomAdapter(this, R.layout.custom_view, itemsList);
gridView.setAdapter(customAdapter);
}
}
使用的两个重要方法是:
- getCount():返回列表中存在的数据元素的数量。
- getView():这是初始化和返回自定义视图的重要方法。
例子
下面给出了一个示例GIF,以使我们对本文中要做的事情有一个了解。注意,我们将使用Java语言实现该项目。
分步实施
步骤1:创建一个新项目
要在Android Studio中创建新项目,请参阅如何在Android Studio中创建/启动新项目。请注意,选择Java作为编程语言。
步骤2:使用activity_main.xml文件
打开activity_main.xml文件,并在其中插入GridView组件。
以下是activity_main.xml文件的代码。
XML格式
步骤3:创建一个新的布局XML文件
在与activity_main.xml文件相同的文件夹中创建一个名为custom_view.xml的新文件。此自定义视图将托管ImageView和TextView 。
以下是custom_view.xml文件的代码。
XML格式
步骤4:创建一个新的Java类
现在,要保留自定义视图的信息,我们需要创建一个getter setter类。我们可以不做任何事情而只使用两个数组,一个数组用于图像,另一个数组用于文本,但是如果我们要修改视图以添加一个按钮,该怎么办。然后将再次需要第三个数组。因此,拥有自定义视图的类是一个更灵活的选项。在与MainActivity相同的文件夹中创建类。 Java创建一个名为items的新类。下面是项目的代码。 Java文件。
Java
public class items
{
private int image_id;
private String text;
public int getImage_id()
{
return image_id;
}
public void setImage_id(int image_id)
{
this.image_id = image_id;
}
public String getText()
{
return text;
}
public void setText(String text)
{
this.text = text;
}
items(int img, String text)
{
image_id = img;
this.text = text;
}
}
Note: For an image, we store the id of the image and not the image.
步骤5:实现CustomAdapter类
创建一个分类为CustomAdapter的新类。 Java与项目位于同一文件夹中。 Java的。适配器的主要方法是getView() 。
Java
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent)
{
View v = convertView;
if (v == null) {
// getting reference to the main layout and
// initializing
LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(custom_layout_id, null);
}
// initializing the imageview and textview
// and setting data
ImageView imageView = v.findViewById(R.id.imageView);
TextView textView = v.findViewById(R.id.textView);
// get the item using the position param
items item = items_list.get(position);
imageView.setImageResource(item.getImage_id());
textView.setText(item.getText());
return v;
}
public View inflate (int resource,ViewGroup root)
Inflate a new view hierarchy from the specified xml resource. Throws InflateException if there is an error.
resource int: ID for an XML layout resource to load (e.g., R.layout.main_page)
root ViewGroup: Optional view to be the parent of the generated hierarchy. This value may be null.
此方法首先使用inflate()方法解析出custom_view.xml文件。该方法在计算上相当昂贵,并且仅应在需要时使用。当用户到达屏幕末端时,适配器必须填充新项目。获取视图的引用后,我们然后从custom_view.xml文件初始化图像视图和文本视图,以设置数据并返回该视图。以下是CustomAdapter的完整代码。 Java文件。在代码内部添加了注释,以更详细地了解代码。
Java
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
public class CustomAdapter extends ArrayAdapter {
List items_list = new ArrayList<>();
int custom_layout_id;
public CustomAdapter(@NonNull Context context, int resource, @NonNull List objects) {
super(context, resource, objects);
items_list = objects;
custom_layout_id = resource;
}
@Override
public int getCount() {
return items_list.size();
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View v = convertView;
if (v == null) {
// getting reference to the main layout and
// initializing
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(custom_layout_id, null);
}
// initializing the imageview and textview and
// setting data
ImageView imageView = v.findViewById(R.id.imageView);
TextView textView = v.findViewById(R.id.textView);
// get the item using the position param
items item = items_list.get(position);
imageView.setImageResource(item.getImage_id());
textView.setText(item.getText());
return v;
}
}
步骤6 :使用MainActivity。 Java文件
对于图像,这里我们使用了android studio图标。图像位于res / drawable文件夹中。应该看起来像这样
在MainActivity文件中:
1.初始化项目清单
Java
List itemsList = new ArrayList<>();
itemsList.add(new items(R.drawable.android_1, "image_1"));
itemsList.add(new items(R.drawable.android_2, "image_2"));
itemsList.add(new items(R.drawable.android_3, "image_3"));
itemsList.add(new items(R.drawable.android_4, "image_4"));
itemsList.add(new items(R.drawable.android_5, "image_5"));
itemsList.add(new items(R.drawable.android_1, "image_6"));
itemsList.add(new items(R.drawable.android_2, "image_7"));
itemsList.add(new items(R.drawable.android_3, "image_8"));
itemsList.add(new items(R.drawable.android_4, "image_9"));
itemsList.add(new items(R.drawable.android_5, "image_10"));
2.获取GridView的引用,然后设置自定义适配器
Java
GridView gridView = findViewById(R.id.grid_view);
CustomAdapter customAdapter = new CustomAdapter(this, R.layout.custom_view, itemsList);
gridView.setAdapter(customAdapter);
以下是MainActivity的完整代码。 Java文件。在代码内部添加了注释,以更详细地了解代码。
Java
import android.os.Bundle;
import android.widget.GridView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List itemsList = new ArrayList<>();
itemsList.add(new items(R.drawable.android_1, "image_1"));
itemsList.add(new items(R.drawable.android_2, "image_2"));
itemsList.add(new items(R.drawable.android_3, "image_3"));
itemsList.add(new items(R.drawable.android_4, "image_4"));
itemsList.add(new items(R.drawable.android_5, "image_5"));
itemsList.add(new items(R.drawable.android_1, "image_6"));
itemsList.add(new items(R.drawable.android_2, "image_7"));
itemsList.add(new items(R.drawable.android_3, "image_8"));
itemsList.add(new items(R.drawable.android_4, "image_9"));
itemsList.add(new items(R.drawable.android_5, "image_10"));
GridView gridView = findViewById(R.id.grid_view);
CustomAdapter customAdapter = new CustomAdapter(this, R.layout.custom_view, itemsList);
gridView.setAdapter(customAdapter);
}
}