GridView с использованием универсального загрузчика изображений не отображает элементы и метод getView адаптера, вызываемый только с позицией 0

Я пытаюсь создать сетку для любимых изображений с помощью универсального загрузчика изображений. В настоящее время изображения не отображаются и не загружаются. Точно так же моя отладка также обнаружила, что getView вызывается только с position == 0. Пожалуйста, помогите!

Ниже я перечисляю:

  1. Фрагменты кода, создающие фиктивный список массивов и пользовательский адаптер.

  2. XML-файл макета фрагмента

  3. Пользовательский адаптер, который использует универсальный загрузчик изображений и средство просмотра, которое содержит относительный макет с изображением внутри.

  4. XML-файл макета элемента для gridview/viewholder.

    1. FavoritesFragment.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;
    }
}
  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. ИзбранноеИзображениеАдаптер.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 раз используют позицию 0 массива. Пожалуйста, помогите, я надеюсь стать лучше в Android с помощью этого побочного проекта. Также прошу прощения за ошибки форматирования кода в начале. Я пытался исправить это, но это не сработало.


person slackbot39243    schedule 29.12.2014    source источник
comment
Проверьте: stackoverflow.com/questions/26923853/   -  person Haresh Chhelana    schedule 29.12.2014
comment
Я проверил, спасибо за подсказку о запросе Android. Хотел бы я знать, что он существует. Однако ваш ответ в этом потоке ничего не меняет, кроме замены UIL с запросом Android, который не исправляет тот факт, что он будет загружать позицию 0 6 раз, а не позицию загрузки 0-5. Точно так же я скептически отношусь к тому, что замена запроса Android заставит мои изображения отображаться, потому что я не думаю, что универсальный загрузчик изображений был проблемой. Я думаю, что сделал ошибку, но я не могу ее найти. В частности, я думаю, что это связано с компонентом gridView пользовательского интерфейса, но я точно не знаю. Спасибо за помощь!   -  person slackbot39243    schedule 29.12.2014


Ответы (3)


@eduardowarded: я наблюдаю, что вы используете шаблон держателя для быстрой прокрутки. Что я могу предложить вам добавить новое свойство в FavoritesImageViewHolder как int position. В методе getVirew вы должны назначить FavoritesImageViewHolder.position = position. И для доступа к позиции вы должны использовать FavoritesImageViewHolder.position. Этот тип проблем возникает из-за того, что при прокрутке списка будет вызываться getView, и он не синхронизируется, что приводит к тому, что потоки обновляют значения.

Я надеюсь, что это поможет вам в решении вашей проблемы.

person Roll no1    schedule 29.12.2014

Надеюсь, это поможет вам

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);
}
person Son Nguyen Thanh    schedule 29.12.2014
comment
Итак, спасибо, можете ли вы сделать это с PACASA lib: - person Son Nguyen Thanh; 30.12.2014
comment
см. мой ответ ниже, он исправил это. - person slackbot39243; 30.12.2014

Я обнаружил ответ. У меня должен быть файл 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 раз. Просто задержалось время загрузки.

пока я идиот

person slackbot39243    schedule 29.12.2014