为什么要更改布局参数的设置解决我的"OnClickListener不能在GridView中的第一项工作"问题?

 灬我的独一小姐灬 发布于 2023-02-12 12:32

我正在使用GridView来显示一些图像并且我遇到了问题,因为onClickListener不适用于第一个图像.我在SO处发现了一些其他问题同样的问题,但我不喜欢他们的"正确答案",因为他们大多采用相同的方法:

OnClickListener不适用于ViewPager中GridView中的第一项

基本上,每次调用getview时都要实例化视图.这对于性能很糟糕,并且它们可能会在许多设备中面临内存不足的问题.

在我的例子中,我在GridView中显示位于assets文件夹中的子文件夹内的图像.

我的原始代码带有"第一项"问题(实际上,我的原始代码实现了视图模式,但这个更简单并面临同样的问题):

    @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;

}

移动代码解决了这个问题imageView.setLayoutParams(new GridView.LayoutParams(imageWidth, imageWidth));.

但为什么?我不确定.

我在某处(在SO中)读到它可能正在发生,因为尝试访问尚未膨胀的视图,并且用户建议使用getViewTreeObserver(),但我尝试了这种方法并且无法解决问题.

因此,我决定对代码进行试错,以查看瓶颈在哪里,并找到给定的解决方案.

任何人都知道为什么解决这个问题?

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有