Android: 为 Gridview 网格使用两个不同的适配器

Android: Using two different Adapters for a Gridview grid

我想知道是否可以为某个 4X4 维度网格应用两个不同的适配器(ArrayAdapter 用于字符串数组,ImageAdapter 用于数组中每个值的背景)……我问这个是因为我的实际 (下面的代码只是一个示例)程序包含用户输入的高度和宽度值(),而不是硬编码。说,如果我想将棕色块分配为奇数的背景,并使用 grid.setAdapter() 为两个适配器分配灰色块作为偶数的背景......我将如何使用 Android工作室?

下面是网格的 Java 代码:

package dpark.sample;

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {
    private int height, width;
    String[] list;
    GridView grid;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        height = 4;
        width = 4;

        buildList();

        grid = (GridView)findViewById(R.id.gridView);

        ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
                android.R.layout.simple_list_item_1, list);
        grid.setAdapter(adapter);
        grid.setNumColumns(width);

        //***TEMPORARILY COMMENTING THE FOLLOWING OUT SINCE THIS WILL JUST OVERWRITE THE
        // ARRAYADAPTER***
        //grid.setAdapter(new ImageAdapter(getApplicationContext()));
    }

    private void buildList() {
        int tempIncrementor = 1;
        int dimensions = height * width;

        list = new String[dimensions];

        for (int i = 0; i < dimensions; i++) {
            list[i] = String.valueOf(tempIncrementor);

            tempIncrementor++;
        }
    }

    public class ImageAdapter extends BaseAdapter {
        private Context mContext;

        public ImageAdapter(Context c) {
            mContext = c;
        }

        public int getCount() {
            return mThumbIds.length;
        }

        public Object getItem(int position) {
            return null;
        }

        public long getItemId(int position) {
            return 0;
        }

        // create a new ImageView for each item referenced by the Adapter
        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView imageView;
            if (convertView == null) {
                // if it's not recycled, initialize some attributes
                imageView = new ImageView(mContext);
                imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
                imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
                imageView.setPadding(8, 8, 8, 8);
            } else {
                imageView = (ImageView) convertView;
            }

            imageView.setImageResource(mThumbIds[position]);
            return imageView;
        }

        // references to our images
        private Integer[] mThumbIds = {
                R.drawable.brownblock,
                R.drawable.grayblock
        };
    }
}

...在虚拟模拟器中输出:

... 至于输出色块图像,我暂时在我的代码中注释掉了ArrayAdapter块,所以我可以输出以下内容:

不,您不能设置两个适配器,因为 setAdapter 方法会覆盖前一个。

但您的目标不需要它,您应该将值存储在数组列表中并在 getView 方法中检索它们。