ViewPager не может лениво загружать изображения с Picasso

У меня есть FragmentActivity на первой вкладке TabHost, а FragmentActivity содержит ViewPager.

Метод setAdapter() ViewPager устанавливает FragmentPagerAdapter с набором Fragments. Цель состоит в том, чтобы иметь перелистываемые изображения на первой панели TabHost.

Чтобы проверить это, я загрузил кучу изображений, которые я хранил локально в каталоге проекта drawable. Все работало прекрасно.

После тестирования этой первоначальной настройки я загружаю кучу URL-адресов изображений с веб-службы REST. Я хочу, чтобы эти изображения лениво загружались в ViewPager, и я попытался вызвать метод load() Пикассо в трех местах:

  1. Метод onCreateView() из Fragments ViewPager (то же место, где я ранее загружал изображения из локального каталога drawable).

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) {                
    
        View myFragmentView = inflater.inflate(R.layout.layout_fragment, container, false);
    
        ImageView imageView = (ImageView)getView().findViewById(R.id.fragment_image);
        String url = getArguments().getString(IMAGE_RESOURCE_URL);
        Context context = getActivity();
        Picasso.with(context).load(url).fit().into(imageView);
    
        return myFragmentView;
    }
    
  2. Метод onViewCreated() Fragments ViewPager.

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState){
    
        Context context = getActivity();
        String url = getArguments().getString(IMAGE_RESOURCE_URL);
        ImageView imageView = (ImageView)view.findViewById(R.id.fragment_image);
        Picasso.with(context).load(url).fit().into(imageView);      
    
    }        
    
  3. Метод onInstantiateItem() FragmentPagerAdapter.

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
    
        View v = inflater.inflate(R.layout.layout_fragment, container, false);
        Context context = Tab1Activity.this;
        String url = getItem(position).getArguments().getString("IMAGE_RESOURCE_URL");
        ImageView imageView = (ImageView)v.findViewById(R.id.fragment_image);
        Picasso.with(context).load(url).fit().into(imageView);
        return v;
    }
    

Ни один из этих методов не сработал. Я знаю, что это не проблема с Пикассо, потому что на днях я попробовал использовать Пикассо в ListView, и это сработало как шарм. Что я делаю не так ?




Ответы (2)


Ваш первый подход должен работать нормально... если вы правильно его реализуете. Я ожидаю, что ваш код выйдет из строя с ошибкой NullPointerException.

Заменять:

ImageView imageView = (ImageView)getView().findViewById(R.id.fragment_image);

с:

ImageView imageView = (ImageView)myFragmentView.findViewById(R.id.fragment_image);
person CommonsWare    schedule 08.02.2014
comment
Ну, я идиот. Большое спасибо, CommonsWare. Хотя Пикассо все еще не работает, даже после того, как я исправил свою ошибку. Каждый раз, когда я пробую это с Picasso, LogCat показывает странное ПРЕДУПРЕЖДАЮЩЕЕ сообщение: VFY: невозможно разрешить статический метод 571: Landroid/net/TrafficStats;.setThreadStatsTag (I)V. Я закончил тем, что сделал это с Volley, который отлично работает. - person Y.S; 11.02.2014
comment
@JohnG: Это просто предупреждение, указывающее, что вы работаете на устройстве, на котором отсутствует этот конкретный класс (TrafficStats) или метод (setThreadStatsTag()). Если бы вы не разбились, Пикассо правильно пропустил бы это утверждение. - person CommonsWare; 11.02.2014
comment
Моя проблема похожа, но это не помогает, проверьте мой ТАК вопрос @CommonsWare, пожалуйста. stackoverflow.com/questions/21890598 / Заранее спасибо. - person wendigo; 19.02.2014

Ваш ленивый загрузчик должен работать в контексте

Фрагмент.createView()

где Fragment является одной из коллекций, выгружаемых ViewPager и FragmentpagerAdapter

Это ваш вариант номер один.

Я использую другой отложенный загрузчик, который управляет локальным кэшем памяти и локальным кешем файловой системы для растровых изображений, необходимых для загрузки изображений. во время «OnCreateView()» он отправится в сеть, чтобы получить URL-адрес для загрузчика, если растровое изображение еще не кэшировано.

person Robert Rowntree    schedule 08.02.2014