1

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

下面我列出:

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

  2. 片段的xml布局文件

  3. 使用 Universal Image Loader 的自定义适配器和一个 viewholder,其中包含一个相对布局和一个 imageView。

  4. gridview/viewholder 的项目的 xml 布局文件。

    1. 收藏夹Fragment.java:

    公共类收藏夹片段扩展片段{

    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;
    }
}
  1. 片段收藏夹.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" />
    

  2. 收藏夹ImageAdapter.java:

    公共类 FavoritesImageAdapter 扩展 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);
        }
    }
    

    }

  3. 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 次都使用 arraylist 的位置 0。请帮忙,我希望通过这个项目在 android 上变得更好。另外,对于开头的代码格式错误,我深表歉意。我试图修复它,但它不起作用。

4

3 回答 3

1

@eduardowarded:我观察到的是您正在使用Holder 模式进行快速滚动。我可以建议您在 FavoritesImageViewHolder 中添加新属性作为 int 位置。在 getVirew 方法中,您必须分配 favoritesImageViewHolder.position = position。要访问位置,您应该使用 favoritesImageViewHolder.position。出现这种类型的问题是因为在滚动列表getView时将被调用并且它不同步,这会导致线程更新值。

我希望这将帮助您解决您的问题。

于 2014-12-29T05:44:22.393 回答
1

希望它可以帮助你

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);
}
于 2014-12-29T06:39:20.493 回答
1

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

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

之前,我使用 item_grid_favorites_image.xml 的相对布局具有 fill_parent 高度,这导致通用图像加载器永远加载图片。此外,这就是为什么 onLoadingStarted() 被调用了 6 次,而 onLoadingComplete() 被调用了 0 次的原因。它只是被加载时间拖住了。

直到我是个白痴

于 2014-12-29T17:20:26.780 回答