📜  GridView在示例中使用Android中的自定义ArrayAdapter

📅  最后修改于: 2021-05-08 19:19:01             🧑  作者: Mango

本文将构建一个应用程序,以演示GridViewCustomArrayAdapters的用法。 GridViews是视图容器,以二维(行和列)显示视图,它们在我的android应用程序中使用,一个简单的示例就是gallery应用程序。适配器将UI元素与数据源连接起来,它有助于我们照顾好数据。例如,当用户滚动图库应用程序时,将自动填充GridView而无需指定任何内容。有几种不同的适配器。

  • 阵列适配器
  • BaseAdapter
  • 自定义ArrayAdapter

本文将介绍Custom ArrayAdapter。

为什么要使用自定义ArrayAdapter?

Android已经提供了ArrayAdapter的实现,仅可用于下面演示的一行。只要有单个项目的列表,便可以使用ArrayAdapter来使用它们。例如,电话联系人,国家/地区或姓名的列表。以下是用于显示文本数据的ArrayAdapter的语法。

这种方法的问题或局限性,我们不能使用复杂的布局,例如。想象我们正在构建一个像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);
    }
}


使用的两个重要方法是:

  1. getCount():返回列表中存在的数据元素的数量。
  2. getView():这是初始化和返回自定义视图的重要方法。

例子

下面给出了一个示例GIF,以使我们对本文中要做的事情有一个了解注意,我们将使用Java语言实现该项目。

在Android中使用自定义ArrayAdapter进行GridView

分步实施

步骤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的新文件。此自定义视图将托管ImageViewTextView

以下是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;
    }
}

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

此方法首先使用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);
    }
}

最终项目结构

输出

想要一个节奏更快,更具竞争性的环境来学习Android的基础知识吗?
单击此处,前往由我们的专家精心策划的指南,以使您立即做好行业准备!