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

使用通用图像加载器的GridView不显示项目

广乐邦
2023-03-14

我正在尝试使用通用图像加载器为最喜欢的图像创建一个网格视图。目前,没有图像出现或加载。同样,我的调试也发现getView仅在位置==0时调用。请帮助!

下面我列出:

>

  • 创建虚拟数组列表和自定义适配器的片段代码片段

    片段的 xml 布局文件

    使用通用图像加载程序的自定义适配器和一个视图持有者,该视图持有者内部装有图像视图的相对布局。

    gridview/viewholder的项的xml布局文件。

    1. 收藏夹片段.java:

    公共类FavoritesFragment扩展片段{

    private GridView gridView;
    private Button imageButton;
    private FavoritesImageAdapter favoritesImageAdapter;
    

    ...

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ArrayList<String> exampleUrls = new ArrayList<String>(); //Used for testing
            exampleUrls.add("http://i.imgur.com/gOD1PVH.jpg");
            exampleUrls.add("http://i.imgur.com/HB6wZox.jpg");
            exampleUrls.add("http://i.imgur.com/gOD1PVH.jpg");
            exampleUrls.add("http://i.imgur.com/HB6wZox.jpg");
            exampleUrls.add("http://i.imgur.com/HB6wZox.jpg");
            exampleUrls.add("http://i.imgur.com/gOD1PVH.jpg");
    
            favoritesImageAdapter = new FavoritesImageAdapter(getActivity(), 0, exampleUrls);
    
            setHasOptionsMenu(true); // Allows the fragment to change the menu buttons
    
    
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
    
            View view = inflater.inflate(R.layout.fragment_favorites, container, false);
            gridView = (GridView) view.findViewById(R.id.gridView);
    
            gridView.setAdapter(favoritesImageAdapter);
            getActivity().getActionBar().setTitle("Favorites");
            return view;
        }
    }
    

    fragment_favorites.xml:

    <GridView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/gridView"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:numColumns="3"
        android:background="@color/blue_200"
        android:layout_above="@+id/favoritesButtonLayout"/>
    
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:paddingBottom="10px"
        android:id="@+id/favoritesButtonLayout">
    
        <Space
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
        <ImageButton
            android:layout_weight="10"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imageButton"
            android:src="@drawable/ic_action_camera"/>
    
        <Space
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
        <ImageButton
            android:layout_weight="10"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/videoButton"
            android:src="@drawable/ic_action_video"/>
    
        <Space
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
    
    
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/onboardingFavoritesImageView"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />
    

    收藏夹图像适配器.java:

    公共类收藏夹图像适配器扩展了 BaseAdapter{

    LayoutInflater layoutInflater;
    private Context mContext;
    private ArrayList<String> imageUrls;
    private ImageLoader imageLoader;
    DisplayImageOptions options;
    
    public FavoritesImageAdapter(Context context, int resource, ArrayList<String> urls){
        layoutInflater = layoutInflater.from(context);
        mContext = context;
        this.imageUrls = urls;
        imageLoader = ImageLoader.getInstance();
        options = new DisplayImageOptions.Builder()
                .showImageForEmptyUri(R.drawable.ic_empty)
                .showImageOnFail(R.drawable.ic_error)
                .resetViewBeforeLoading(true)
                .cacheOnDisk(true)
                .imageScaleType(ImageScaleType.EXACTLY)
                .bitmapConfig(Bitmap.Config.RGB_565)
                .considerExifParams(true)
                .displayer(new FadeInBitmapDisplayer(300))
                .build();
    }
    
    
    
    
    @Override
    public int getCount() {
        Log.d("howmany", ""+imageUrls.size());
        return imageUrls.size();
    }
    
    @Override
    public Object getItem(int position) {
        return imageUrls.get(position);
    }
    
    @Override
    public long getItemId(int position) {
        return position;
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final FavoritesImageViewHolder favoritesImageViewHolder;
        final String url = (String)getItem(position); //TODO If the cast works delete this TODO
    
        if(convertView == null){
            RelativeLayout rootView = (RelativeLayout) layoutInflater.inflate(R.layout.item_grid_favorites_image, parent, false);
            favoritesImageViewHolder = FavoritesImageViewHolder.create(rootView);
            rootView.setTag(favoritesImageViewHolder);
        }
        else{
            favoritesImageViewHolder = (FavoritesImageViewHolder) convertView.getTag();
        }
    
        imageLoader.displayImage((String)getItem(position), favoritesImageViewHolder.imageView, options, new SimpleImageLoadingListener() {//TODO If the cast works delete this TODO
                    @Override
                    public void onLoadingStarted(String imageUri, View view) {
                        //holder.progressBar.setProgress(0);
                        //holder.progressBar.setVisibility(View.VISIBLE);
                        Log.d("doesthishappen", "yes0");
                    }
    
                    @Override
                    public void onLoadingFailed(String imageUri, View view,
                                  FailReason failReason) {
                        //holder.progressBar.setVisibility(View.GONE);
                        Log.d("doesthishappen", "yes1");
                    }
    
                    @Override
                    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                        //holder.progressBar.setVisibility(View.GONE);
                        Log.d("doesthishappen", "yes2");
                    }
                }, new ImageLoadingProgressListener() {
                    @Override
                    public void onProgressUpdate(String imageUri, View view, int current,
                                                 int total) {
                        //holder.progressBar.setProgress(Math.round(100.0f * current / total));
                    }
                }
        );
    
        return favoritesImageViewHolder.rootView;
    
    }
    
    
    
    /**
     * ViewHolder's allow for a single object to maintain a Goal row item, so that the row item
     * doesn't have to create each individual component (textview layout etc.) each time the
     * row object is created/recreated. Allows for fast scrolling with little latency.
     */
    private static class FavoritesImageViewHolder {
        public final RelativeLayout rootView;
        public final ImageView imageView;
    
    
        private FavoritesImageViewHolder(RelativeLayout rootView, ImageView imageView) {
            this.rootView = rootView;
            this.imageView = imageView;
        }
    
        public static FavoritesImageViewHolder create(RelativeLayout rootView){
            ImageView imageView = (ImageView)rootView.findViewById(R.id.favoritesMediaView);
            return new FavoritesImageViewHolder(rootView, imageView);
        }
    }
    

    }

    item_grid_favorites_image.xml:

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/favoritesMediaView"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />
    

    我不确定为什么会这样。我知道所有6个假的URL都被传递给了适配器,我也知道getView方法被调用了6次。我还知道Universal Image Loader从未到达onLoadingComplete()回调方法,但它确实调用了onLoadingStarted() 6次。这6次都使用了数组列表的位置0。请大家帮帮忙,希望通过这个旁门左道的项目,能更好的掌握android。另外,我为开头的代码格式错误道歉。我试图修理它,但是它不起作用。

  • 共有3个答案

    胡安怡
    2023-03-14

    我发现了答案。我应该有一个与这个基本相同的item_grid_favorites_image.xml:https://github.com/nostra13/Android-Universal-Image-Loader/blob/master/sample/res/layout/item_grid_image.xml

    如果您想知道这是如何工作的:

    之前,我使用了一个相对布局fill_parent高度的item_grid_favorites_image.xml,这导致通用图像加载器加载图片需要很长时间。这也是为什么onLoadingStarted()被调用了6次,而onLoadingFinal()被调用了0次。它只是被加载时间耽搁了。

    直到我变成白痴

    萧成文
    2023-03-14

    希望它能帮助你

    if(convertView == null){
        RelativeLayout rootView = (RelativeLayout) layoutInflater.inflate(R.layout.item_grid_favorites_image, parent, false);
        favoritesImageViewHolder = FavoritesImageViewHolder.create(rootView);
        rootView.setTag(favoritesImageViewHolder);
    //add this code to your adapter
    favoritesImageViewHolder.imageView.setTag(position);
    }
    
    仉嘉泽
    2023-03-14

    @eduardowarded:我观察到的是你正在使用持有人模式进行快速滚动。我可以建议你在收藏夹中添加新的属性图像视图持有人作为int位置。在 getVirew 方法中,您必须分配收藏夹图像查看持有者.要访问位置,您应该使用收藏夹图像视图持有者。出现这种类型的问题是因为在滚动列表时,将调用getView并且它未同步,从而导致线程更新值。

    我希望这能帮助你解决你的问题。

     类似资料:
    • 问题内容: 我知道互联网上有成千上万个示例,但是对于脚本,我已经必须在检索数据时显示加载的gif图像。我的Java知识很差,因此我想问如何更改以下内容: 我的div在这里: 谢谢。约翰 问题答案: 假设您在页面上某处有一个标签,其中包含您的加载消息: 您可以在ajax调用中添加两行:

    • 问题内容: 问题描述: 我正在创建一个滚动的带有缩略图的文章列表,该列表由我的SQLite数据库填充。通常,它运行缓慢,但速度较慢: 图像加载非常缓慢…我想使用“ 通用图像加载器 ”将图像缓存在设备上,如果您已经查看过图像(或者至少接近该图像,那会使它们看起来只是滚动到视图中) )。但是- 当您向上/向下拖动时,没有任何图像,然后在3-5秒后,图像开始弹出(就像重新下载它们一样) 我正在动态更改缩

    • 我是NodeJS的新手,我正在使用express、ejs和Multer(处理多部分/表单数据)开发一个项目,以便上传一张图片(单个>>个人资料图片)。我一直试图在一个视图中显示上传的文件(图像),但没有成功。我有关于上传文件(req.file)的所有信息,但我不能用它做任何事情。 有人能帮帮我吗。 问候你,多娜

    • 问题内容: 我有一个React应用,可以调用我的API,该API返回URL列表以用作imy图像src。 我用来显示图像加载时的加载微调组件。 我有一个变量来确定图像是否正在加载。 我无法弄清楚如何停止显示正在加载的微调器,并在它们全部加载后显示图像。 这是我的代码: Photos.jsx Photo.jsx 我尝试将我的最后一项用于,但是它永远不会被调用,因为由于仍然显示了微调框,所以它从未设置为

    • 我想在GridView中显示图像列表。但我做不到。我想知道资产中图像列表的数据类型,以及构造函数在这种情况下的帮助。我刚刚开始学习颤振,我不知道如何使用它。

    • 如何显示一个进度条,同时获取图像从URL在线圈。?