我正在使用GridView来显示一些图像,我遇到了一个问题,因为onClickListener对第一张图像不起作用。我在SO找到了一些具有相同问题的其他问题,但我不喜欢它们的“正确答案”,因为它们中的大多数都采用了相同的方法:
基本上,每次调用getview时都会实例化视图。这对性能来说很糟糕,并且他们可能会在许多设备中面临内存不足的问题。
在我的情况下,我在 GridView 中显示位于资产文件夹的子文件夹中的图像。
我的原始代码存在“第一项”问题(实际上,我的原始代码实现了视图持有者模式,但这个代码更简单,并且面临同样的问题):
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
imageView = new ImageView(_activity);
} else {
imageView = (ImageView) convertView;
}
// get screen dimensions
AssetManager assetManager = _activity.getAssets();
InputStream assetIn = null;
try {
assetIn = assetManager.open(_assets_subdir + File.separator + _filePaths.get(position));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Bitmap image = BitmapFactory.decodeStream(assetIn);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setLayoutParams(new GridView.LayoutParams(imageWidth, imageWidth));
imageView.setImageBitmap(image);
// image view click listener
imageView.setOnClickListener(new OnImageClickListener(position));
return imageView;
}
我解决问题的最终代码:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
imageView = new ImageView(_activity);
imageView.setLayoutParams(new GridView.LayoutParams(imageWidth, imageWidth));
} else {
imageView = (ImageView) convertView;
}
// get screen dimensions
AssetManager assetManager = _activity.getAssets();
InputStream assetIn = null;
try {
assetIn = assetManager.open(_assets_subdir + File.separator + _filePaths.get(position));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Bitmap image = BitmapFactory.decodeStream(assetIn);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setImageBitmap(image);
// image view click listener
imageView.setOnClickListener(new OnImageClickListener(position));
return imageView;
}
此问题已通过移动代码< code>imageView.setLayoutParams(新GridView)得到解决。LayoutParams(imageWidth,image width));。
但是为什么呢?我不确定。
我在某处(SO)读到,这可能是因为试图访问尚未膨胀的视图,用户建议使用getViewTreeObserver()
,但我尝试了这种方法,但无法解决问题。
所以,我决定对代码进行反复试验,看看瓶颈可能在哪里,并找到给定的解决方案。
有人知道为什么这能解决问题吗?
你的GridView
中只有ImageView?为什么不使用setOnItemClickListener
而不是OnItemClickListener
?
像这样,在你的活动
中:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
gridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
// here you have what you want ...
}
});
}
网格视图从绝对列表视图扩展 -
通过在每次调用getView时初始化一组新的布局参数(而不仅仅是在重新创建视图时),您将丢失此状态数据。
我(目前)不清楚为什么它只会给网格中的第一个项目带来问题。
我在创建基于GridView的日历时遇到问题。下面是网格: 这应该是一个包含事件的日历,所以我让适配器实现OnClickListener,并为日历中的每个按钮设置侦听器。它适用于除第一个按钮(在本例中为30号)以外的每个按钮。当我单击它时,它就是不起作用,但当我在尝试单击第一个按钮后单击另一个按钮时,它会在单击另一按钮之前对第一个按钮执行单击。 我已经浏览了大约10页的相关问题,没有发现有人有这个
问题内容: 我想从主模块和所有子模块登录到单个日志文件。 从主文件(我在其中定义记录器)发送的日志消息按预期工作。但是缺少从调用发送到导入函数的函数。 如果我使用下面的示例1中的logging.basicConfig,它将正常工作。但是允许更多自定义设置的第二个示例不起作用。 有什么想法吗? 示例1-工作 在这里,我创建了两个处理程序,并将它们传递给: 示例2-无法正常工作 在这里,我创建两个处理
在ViewPager中,有一个网格视图,其中有一个带有文本视图和图像的单选答案网格。当我点击任何答案时,文本视图应该将其颜色更改为红色或白色。除了第一个答案,其他所有答案都可以正常工作。当我第一次点击网格视图中的第一个答案时,它不会更改颜色,第二次点击时它会变成红色,但是当我更改选项时,第一个选项的红色不会更改为白色。请看下面的屏幕, 抱歉,由于我是新用户,不允许提交屏幕。。。 在< code >
下面的代码是我解决这个问题的尝试。我使用了基于1的索引。我无法找出错误。我试着调试代码,但没有帮助。我已经被困了两天了。请帮忙。
这应该是一个匹配每个按钮的数字的游戏。将有12个不同的数字,数字将被设置为随机按钮(2个按钮将有相同的数字)。玩家必须单击第一个按钮,按钮将变为红色,如果玩家再次单击另一个按钮,它将检查它是否有相同的数字,如果是,则两个按钮都将保持红色。对于按钮,我使用按钮的网格模式。我将所有按钮设置为黑色,如果我单击按钮,它将改变其颜色为红色。按钮显示正确,所有按钮都工作正常,除了第一个按钮(左上角),它不会变