【问题标题】:How to add an empty row to GridView programmatically:如何以编程方式向 GridView 添加空行:
【发布时间】:2014-12-07 17:16:07
【问题描述】:

我知道这个问题已经被问过几次,而且我知道您会说 GridView 与 ListView 对象一样也由应填充网格行的适配器实现支持。

我的要求如下:我有一个表情符号的网格视图,当我按下我开发的键盘上的一个按钮时会显示这些表情符号。作为此表情符号网格视图的一部分,我在其底部有一个按钮视图,以允许用户继续使用键盘(空格、删除、返回常规键盘等按钮...)

现在我想在网格视图中添加一个空行,这样我就可以允许用户在网格的最后一行选择表情符号(如果我不将此行添加到最后一行网格视图位于附加按钮视图后面,无法选择)这是一个示例:

正如您在此处看到的,最后一行位于附加按钮视图的后面,无法按下。我不能只在 gridview 中添加任意数量的空图标,因为当从一个设备移动到另一个设备时,一行中的图标数量会发生变化。

所以问题是如何在不考虑行中项目数的情况下向此网格视图添加一个空行?

这是我的代码:

public class EmojiconGridView{
public View rootView;
EmojiconsPopup mEmojiconPopup;
EmojiconRecents mRecents;
Emojicon[] mData;

public EmojiconGridView(Context context, Emojicon[] emojicons, EmojiconRecents recents, EmojiconsPopup emojiconPopup) {
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    mEmojiconPopup = emojiconPopup;
    rootView = inflater.inflate(R.layout.emojicon_grid, null);
    setRecents(recents);
     GridView gridView = (GridView) rootView.findViewById(R.id.Emoji_GridView);
        if (emojicons== null) {
            mData = People.DATA;
        } else {
            Object[] o = (Object[]) emojicons;
            mData = Arrays.asList(o).toArray(new Emojicon[o.length]);
        }
        EmojiAdapter mAdapter = new EmojiAdapter(rootView.getContext(), mData);
        mAdapter.setEmojiClickListener(new OnEmojiconClickedListener() {

            @Override
            public void onEmojiconClicked(Emojicon emojicon) {
                if (mEmojiconPopup.onEmojiconClickedListener != null) {
                    mEmojiconPopup.onEmojiconClickedListener.onEmojiconClicked(emojicon);
                }
                if (mRecents != null) {
                    mRecents.addRecentEmoji(rootView.getContext(), emojicon);
                }
            }
        });
        gridView.setAdapter(mAdapter);
        View newEmpryView = new View(context);
        gridView.addView(newEmpryView);

}

private void setRecents(EmojiconRecents recents) {
    mRecents = recents;
}

public interface OnEmojiconClickedListener {
    void onEmojiconClicked(Emojicon emojicon);
} 

}

一目了然:

 gridView.addView(newEmpryView);

给了我一个例外::addView(View) is not supported in AdapterView,那么如何实现呢?谢谢。

【问题讨论】:

  • 你能发布你的布局吗?我猜你需要使用 layout_below 或使用 verrical linearlayout 来处理这个

标签: android gridview row adapter android-gridview


【解决方案1】:

您需要在 GridView 的最后一行添加一个空白项,这样您会得到一个空白行。

要获取 GridView 中的列数,您可以使用以下代码:

private int getNumColumnsCompat(Context aContext) {
        DisplayMetrics d = aContext.getResources().getDisplayMetrics();
        int w = d.widthPixels;
        float density = d.density;
        int num = (int) (w / (40 * density)) - 1; // 40 is the columnWidth of your Emoji_GridView
        return num;
    }

然后像下面的代码一样向你的 GridView 添加一个空白行:

private void addItemsToList(int aNumColumnsCompat) {
        for (int i = 0; i < aNumColumnsCompat; i++) {
            mEmojiList.add(new Emojicon(""));
        }
    }

【讨论】:

  • 这是我采用的最终解决方案。
【解决方案2】:

很遗憾,我无法回答您的确切问题

how can I add an empty row to this gridview with no regards to the number of items in the row?

但这是我的想法。首先,您究竟是如何将 GridView 添加到您的视图中的?就像 GridView 在那个地方如何变得可见一样?是附加到活动底部的一些视图,它是一个弹出窗口吗? (我从来没有做过自己的自定义键盘,所以如果这听起来像一个完全愚蠢的无关问题,请原谅)

其次,我知道您不想考虑行中的项目数,但是如何(作为一种解决方法)获取 GridView 的单行中的项目数,然后尝试添加一个空行,基于那个号码?这样,它应该适用于所有不同的设备。

编辑:
您可以使用以下代码获取 GridView 中的列数。

private int getNumColumnsCompat() {
    if (Build.VERSION.SDK_INT >= 11) {
        return getNumColumnsCompat11();

    } else {
        int columns = 0;
        int children = getChildCount();
        if (children > 0) {
            int width = getChildAt(0).getMeasuredWidth();
            if (width > 0) {
                columns = getWidth() / width;
            }
        }
        return columns > 0 ? columns : AUTO_FIT;
    }
}

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private int getNumColumnsCompat11() {
    return getNumColumns();
}

【讨论】:

  • 嗯,表情符号视图是一个弹出窗口,通过长按键盘上的一个按钮来显示。我试图避免计算行中单个项目的数量,但如果我找不到任何方法,我怎样才能获得 gridview 的一行中的项目数?
  • 检查我更新的答案。而且由于它是一个弹出窗口,您不能将弹出窗口在您的活动中定位得更高一点吗?如果您使用的是PopupWindow,那么您需要指定 x,y 坐标对吗?改变y坐标怎么样?
  • 是的,我看到了更新的答案,我将对其进行测试,以防找不到添加整行的方法。关于第二部分,由于带有操作按钮的半透明视图是弹出视图的一部分,因此在这种情况下,您的建议对我没有任何好处。但无论如何,非常感谢您的帮助。如果我找不到更好的选择,我会接受你的回答。
  • 哦,是的,知道了,弹出的 y 坐标建议在这里不会有任何好处!
猜你喜欢
  • 2013-03-09
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 2013-04-29
  • 2016-07-24
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多