我知道这个问题已被问过几次了,我知道你会说的是GridView与ListView对象一样,也是由一个应该填充网格行的适配器实现来备份。
我的要求如下:我有一个表情符号的网格视图,当我按下我开发的键盘上的一个按钮时会显示。作为这个表情符号网格视图的一部分,我在其底部有一个按钮视图,允许用户继续使用键盘(按钮,如空格,删除,返回普通键盘和其他...)
现在我想在gridview中添加一个空行,这样我就可以让用户在网格的最后一行选择表情符号(如果我不想添加此行网格视图的最后一行是在附加按钮视图后面,无法选择)以下是一个示例:
如您所见,最后一行位于附加按钮视图后面,无法按下。我不能在gridview中添加任意数量的空图标,因为当从一个设备移动到另一个设备时,一行中的图标数量会发生变化。
所以问题是如何在这个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
,那么如何实现呢?感谢。
答案 0 :(得分:2)
你需要在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(""));
}
}
答案 1 :(得分:1)
很遗憾,我无法回答您的确切问题
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();
}