1

Universal Image Loader を使用して、お気に入りの画像のグリッドビューを作成しようとしています。現在、画像は表示されず、読み込まれません。同様に、私のデバッグでは、getView が position == 0 でのみ呼び出されることもわかりました。助けてください!

以下にリストします:

  1. ダミー配列リストとカスタム アダプターを作成するフラグメント コード スニペット

  2. フラグメントの xml レイアウト ファイル

  3. Universal Image Loader と、内部に imageView を含む相対レイアウトを保持するビューホルダーを使用するカスタム アダプター。

  4. gridview/viewholder のアイテムの xml レイアウト ファイル。

    1. FavoritesFragment.java:

    public class FavoritesFragment extends Fragment {

    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. 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" />
    

  2. お気に入りImageAdapter.java:

    public class 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 が使用されます。助けてください、私はこのサイドプロジェクトを通じてアンドロイドが上手くなりたいと思っています. また、冒頭のコードフォーマットエラーについてお詫び申し上げます。修正しようとしましたが、うまくいきませんでした。

4

3 に答える 3

1

私は答えを発見しました。これと本質的に同じ 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 回呼び出されたのに、onLoadingComplete() が 0 回呼び出された理由です。ロード時間で止まっただけです。

TIL 私は馬鹿です

于 2014-12-29T17:20:26.780 に答える
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 に答える