我有一个用于单词搜索应用程序的GridView,我正在其中填充一个字符串数组。 但是我想从左下角开始填充,然后向上填充,而不是默认的左上角填充。

我之前在这里问了一个问题,有人告诉我要实现此目标的方法是编写一个自定义的ArrayAdapter,但是我对Android还是很陌生,不知道如何从左下角填充网格在适配器中。

我还仍然需要能够获得被单击的网格中项目的元素编号,类似于我现在正在做的事情:

position = wordsearchGrid.pointToPosition((int)X, (int)Y);

这是到目前为止我为自定义适配器提供的代码,它可以工作,但是显然仍然从左上方填充:

public class GridAdapter extends ArrayAdapter
{
    Context context;
    Object[] items;
    int resource;

    LayoutInflater inflater;

    public GridAdapter(Context context, int resource, Object[] items) 
    {
        super(context, resource, items);
        this.context = context;
        this.resource = resource;
        this.items = items;

        inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() 
    {
        return items.length;
    }

    @Override
    public Object getItem(int position) 
    {
        return items[position];
    }

    @Override
    public long getItemId(int position) 
    {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
            TextView cell;

            int cellWidth = 40;
            int cellHeight = 50;


            if (convertView == null) 
            {
                // If convertView is null then inflate the appropriate layout file
                convertView = inflater.inflate(resource, null);
            }

            cell = (TextView) convertView.findViewById(R.id.gridCell);

            cell.setText((CharSequence) items[position]);

            // Set height and width constraints for the image view
            cell.setLayoutParams(new LinearLayout.LayoutParams(cellWidth, cellHeight));

            // Set Padding for images
            cell.setPadding(1, 1, 1, 1);

            return convertView;
    }
}

谁能简单介绍一下如何填充网格,使左下角的单元格成为数组的第一个元素?

谢谢。

===============>>#1 票数:2 已采纳

我对自定义ArrayAdapter也遇到同样的问题。 检查GridView后,我发现它是从AbsListView派生的,并且有android:stackFromBottom属性可以指定是否从底部开始堆叠内容。

<GridView ...
    android:stackFromBottom="false"
/>

通过在GridView布局XML中使用android:stackFromBottom =“ false”元素,我解决了该问题。 仅供参考。

===============>>#2 票数:0

在花了整夜的时间之后,我设法找到了解决方法,不确定这是否是最好的方法,但是它的工作方式完全符合我的需要。

public class GridAdapter extends ArrayAdapter<Object>
{
    Context context;
    Object[] items;
    int resource;
    int puzzleWidth;
    int newPosition;
    LayoutInflater inflater;
    SparseIntArray positionMap = new SparseIntArray();

    public GridAdapter(Context context, int resource, Object[] items, int puzzleWidth) 
    {
        super(context, resource, items);
        this.context = context;
        this.resource = resource;
        this.items = items;
        this.puzzleWidth = puzzleWidth;

        inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() 
    {
        return items.length;
    }

    @Override
    public Object getItem(int position) 
    {
        return items[position];
    }

    @Override
    public long getItemId(int position) 
    {
        //returns the new position
        return positionMap.get(position);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
            TextView cell;

            int cellWidth = 40;
            int cellHeight = 40;

            //works out the row number by rounding down position/puzzleWidth
            long rowNumber = (long)position / puzzleWidth;

            //changes position from top down to bottom up
            switch ((int)rowNumber)
            {
                case 0:
                    newPosition = position + ((puzzleWidth - 1) * puzzleWidth);
                    break;
                case 1:
                    newPosition = position + ((puzzleWidth - 3) * puzzleWidth);
                    break;
                case 2:
                    newPosition = position + ((puzzleWidth - 5) * puzzleWidth);
                    break;
                case 3:
                    newPosition = position + ((puzzleWidth - 7) * puzzleWidth);
                    break;
                case 4:
                    newPosition = position + ((puzzleWidth - 9) * puzzleWidth);
                    break;
                case 5:
                    newPosition = position + ((puzzleWidth - 11) * puzzleWidth);
                    break;
                case 6:
                    newPosition = position + ((puzzleWidth - 13) * puzzleWidth);
                    break;
                case 7:
                    newPosition = position + ((puzzleWidth - 15) * puzzleWidth);
                    break;
                case 8:
                    newPosition = position + ((puzzleWidth - 17) * puzzleWidth);
                    break;
                case 9:
                    newPosition = position + ((puzzleWidth - 19) * puzzleWidth);
                    break;
                case 10:
                    newPosition = position + ((puzzleWidth - 21) * puzzleWidth);
                    break;
                case 11:
                    newPosition = position + ((puzzleWidth - 23) * puzzleWidth);
                    break;
                case 12:
                    newPosition = position + ((puzzleWidth - 25) * puzzleWidth);
                    break;
                case 13:
                    newPosition = position + ((puzzleWidth - 27) * puzzleWidth);
                    break;
                case 14:
                    newPosition = position + ((puzzleWidth - 29) * puzzleWidth);
                    break;
            }

            //store the old and new positions
            positionMap.put(position, newPosition);

            if (convertView == null) 
            {
                // If convertView is null then inflate the appropriate layout file
                convertView = inflater.inflate(resource, null);
            }

            cell = (TextView) convertView.findViewById(R.id.gridCell);

            cell.setText((CharSequence) items[newPosition]);

            // Set height and width constraints for the textview
            cell.setLayoutParams(new LinearLayout.LayoutParams(cellWidth, cellHeight));

            // Set Padding for images
            cell.setPadding(1, 1, 1, 1);

            return convertView;
    }
}

  ask by JasperMoneyshot translate from so

未解决问题?本站智能推荐:

1回复

阵列适配器 帮助填充GridView

所以我有一个具有GridView的布局。 我正在尝试用图像填充它。 因此,我用位图对象填充数组并执行以下操作: 令我沮丧的是,当我启动该应用程序时,它只是崩溃了。 我仍然是android的菜鸟,但感谢您的帮助!
2回复

我需要显示ArrayList 在GridView中使用ArrayAdapter

我需要使用ArrayAdapter在GridView中显示ArrayList,但目前无法正常工作。 这是我的阵列列表: 这是我当前用来填充GridView的代码:
1回复

通过ACTION_DRAG_LOCATION滚动GridView并在ACTION_DROP上交换Gridview的ArrayAdapter中的项目

我希望用户能够交换项目(一个ImageView一个RelativeLayout一个) GridView ,但我也希望他们能够滚动GridView向上或向下,如果他们拖动图像的顶部或底部GridView ,尊重。 如果在支持ArrayAdapter情况下实现拖动侦听器,则无法进行滚动。 如
1回复

使用自定义列表视图时出现奇怪的行为

我的适配器和它的SetAdd类行为很奇怪。 我的gridview包含带有imageview的项目和上面的通知文本。 gridview使用自定义ArrayList填充。 这是执行此操作的代码: 这是我的SetAdd类: 这是我的适配器类: 公共类NewsAd
2回复

如何在AsyncTask中实现自定义ArrayList?

我正在构建一个采用API(电影数据库)并提取JSON数组的Android应用程序。 提取后,将适当的JSONObject发送到模型。 该模型是一个由setter和getter组成的类,用于提取对象并将其分配给我可以使用的变量。 所有这些都是在AsyncTask上完成的。 但是,我很难理解
3回复

在ArrayAdapter内部启动片段

我有一个使用ArrayAdapter填充的gridview。 在GridView中,我有一个Button和ImageView。 我为Button和Image制作了一个监听器,但是我想在点击ImageView时启动一个Fragment。 而且在使用getSupportFragmentMana
1回复

选择一列GridView

我有一个两列的GridView,一个ArrayList填写了GridView。 我的CustomAdapter处理GridView和ArrayList之间的数据。 GridView choiceMode在我的GridView xml文件中是单个,并且我可以同时从左列和右列中进行选择。 现在
1回复

GridView并不包含所有适配器

我制作了一个GridView mGridView和一个225个Views的适配器mAdapter ,并将适配器设置为GridView。 我还做了一个按钮,所以当我单击它时会这样做: 结果是: 这对我来说是个问题,因为我需要使用0到224 mGridView.getChildAt
1回复

Picasso图片未在Gridview Android中加载

我一直在制作一个电影应用程序(项目工作用于在udacity btw上学习android)。 我遇到了一些问题但是通过跟踪这些线程解决了它们无法在ListView中修改ArrayAdapter:UnsupportedOperationException 但是,虽然我的应用程序没有崩溃,但图
1回复

GridView.getItemAtPosition始终为null(但列表显示项目)

我有一个GridView对象。 它显示了来自用户库的照片。 这正在工作,并且列表在屏幕上可滚动。 但是,每当我尝试获取被单击的项目时,都会得到null。 它打印出的位置始终正确。 如果我点击第一个项目,它将告诉我位置为0。但是,它表示该项目为空(这对我来说没有意义,因为它在手