当前位置: 首页 > 知识库问答 >
问题:

为什么更改布局参数的设置可以解决我的“OnClickListener对GridView中的第一项不起作用”的问题?

叶声
2023-03-14

我正在使用GridView来显示一些图像,我遇到了一个问题,因为onClickListener对第一张图像不起作用。我在SO找到了一些具有相同问题的其他问题,但我不喜欢它们的“正确答案”,因为它们中的大多数都采用了相同的方法:

  • On单击查看器不适用于视图页面器内网格视图中的第一项

基本上,每次调用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(),但我尝试了这种方法,但无法解决问题。

所以,我决定对代码进行反复试验,看看瓶颈可能在哪里,并找到给定的解决方案

有人知道为什么这能解决问题吗?

共有2个答案

蔚俊人
2023-03-14

你的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 ...
            }
    });
}
夏弘义
2023-03-14

网格视图从绝对列表视图扩展 -

通过在每次调用getView时初始化一组新的布局参数(而不仅仅是在重新创建视图时),您将丢失此状态数据。

我(目前)不清楚为什么它只会给网格中的第一个项目带来问题。

 类似资料:
  • 我在创建基于GridView的日历时遇到问题。下面是网格: 这应该是一个包含事件的日历,所以我让适配器实现OnClickListener,并为日历中的每个按钮设置侦听器。它适用于除第一个按钮(在本例中为30号)以外的每个按钮。当我单击它时,它就是不起作用,但当我在尝试单击第一个按钮后单击另一个按钮时,它会在单击另一按钮之前对第一个按钮执行单击。 我已经浏览了大约10页的相关问题,没有发现有人有这个

  • 问题内容: 我想从主模块和所有子模块登录到单个日志文件。 从主文件(我在其中定义记录器)发送的日志消息按预期工作。但是缺少从调用发送到导入函数的函数。 如果我使用下面的示例1中的logging.basicConfig,它将正常工作。但是允许更多自定义设置的第二个示例不起作用。 有什么想法吗? 示例1-工作 在这里,我创建了两个处理程序,并将它们传递给: 示例2-无法正常工作 在这里,我创建两个处理

  • 在ViewPager中,有一个网格视图,其中有一个带有文本视图和图像的单选答案网格。当我点击任何答案时,文本视图应该将其颜色更改为红色或白色。除了第一个答案,其他所有答案都可以正常工作。当我第一次点击网格视图中的第一个答案时,它不会更改颜色,第二次点击时它会变成红色,但是当我更改选项时,第一个选项的红色不会更改为白色。请看下面的屏幕, 抱歉,由于我是新用户,不允许提交屏幕。。。 在< code >

  • 下面的代码是我解决这个问题的尝试。我使用了基于1的索引。我无法找出错误。我试着调试代码,但没有帮助。我已经被困了两天了。请帮忙。

  • 这应该是一个匹配每个按钮的数字的游戏。将有12个不同的数字,数字将被设置为随机按钮(2个按钮将有相同的数字)。玩家必须单击第一个按钮,按钮将变为红色,如果玩家再次单击另一个按钮,它将检查它是否有相同的数字,如果是,则两个按钮都将保持红色。对于按钮,我使用按钮的网格模式。我将所有按钮设置为黑色,如果我单击按钮,它将改变其颜色为红色。按钮显示正确,所有按钮都工作正常,除了第一个按钮(左上角),它不会变