ViewPager + Picasso + несколько изображений из массива URL String - PullRequest
0 голосов
/ 11 декабря 2018

Пожалуйста, помогите мне.Я следую примеру ViewPagerActivity из образца PhotoView Криса Бэйнса (https://github.com/chrisbanes/PhotoView)) и хочу изменить рисование с помощью изображений URL-адресов Пикассо. Поэтому я пытаюсь поместить несколько изображений в HackyViewPager с помощью массива URL-адресов String Picasso.

мой xml ViewPager:

<my.package.HackyViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="200dp" />

в onCreate:

...      
ViewPager viewPager = (HackyViewPager) findViewById(R.id.view_pager);
viewPager.setAdapter(new SamplePagerAdapter());

У меня есть строковый массив URL-адресов, полученный из одной строки StringDefinitionGemstonesPhoto

String[] strAry = stringDefinitionGemstonesPhoto.split(",");

и окончательный код в SamplePageAdapter:

static class SamplePagerAdapter extends PagerAdapter {

    private String stringDefinitionGemstonesPhoto = ("https://geology.com/minerals/photos/calcite-marble-127.jpg, https://geology.com/minerals/photos/calcite-concrete.jpg");
    private  String[] strAry = stringDefinitionGemstonesPhoto.split(",");


    @Override
    public int getCount() {
        return strAry.length;
    }

    @Override
    public View instantiateItem(ViewGroup container, int position) {
        PhotoView photoView = new PhotoView(container.getContext());

        System.out.println(strAry[position]);
        Picasso.get().load(strAry[position]).into(photoView);

        container.addView(photoView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        return photoView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

}

При скольжении показывается только одно изображение, следующая фотография пуста / пуста. В системе Log распечатайте ссылки, которыеправильно разделен. Что не так?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Нет необходимости использовать массив чисел отдельно, обновить класс адаптера

static class SamplePagerAdapter extends PagerAdapter {

    private static String[] strAry = stringDefinitionGemstonesPhoto.split(",");


    @Override
    public int getCount() {
        return strAry.length;
    }

    @Override
    public View instantiateItem(ViewGroup container, int position) {
        PhotoView photoView = new PhotoView(container.getContext());

            System.out.println(strAry[position]);
            Picasso.get().load(strAry[position]).into(photoView);

        container.addView(photoView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        return photoView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

}
0 голосов
/ 11 декабря 2018

Я вижу что-то не так, то есть

for(int i= 0; i < numbers.length; i++){
                System.out.println(strAry[i]);
                System.out.println(strAry[position]);
                Picasso.get().load(strAry[position]).into(photoView);
            }

должно быть

            System.out.println(strAry[position]);
            Picasso.get().load(strAry[position]).into(photoView);

ОБНОВЛЕНИЕ

Я обнаружил проблему, Picasso или Glide может плохо работать в instantiateItem(), подробнее

Так что мое решение больше не использует вышеупомянутую библиотеку lib, мы пытаемся запросить URL вручную, этот способ нелучше из-за проблем с производительностью, но это сработало.

Вот мое решение

class SamplePagerAdapter extends PagerAdapter {

    private String stringDefinitionGemstonesPhoto = ("https://geology.com/minerals/photos/calcite-marble-127.jpg, https://geology.com/minerals/photos/calcite-concrete.jpg");
    private String[] strAry = stringDefinitionGemstonesPhoto.split(",");


    @Override
    public int getCount() {
        return strAry.length;
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        PhotoView photoView = new PhotoView(container.getContext());
        try {
            new DownloadImageTask(photoView)
                    .execute(strAry[position]);
        } catch (Exception ex) {
            Log.e("Error", ex.getMessage());
        }

        container.addView(photoView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        return photoView;
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView((View) object);
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return view == object;
    }

    public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
        private ImageView bmImage;

        DownloadImageTask(ImageView bmImage) {
            this.bmImage = bmImage;
        }

        protected Bitmap doInBackground(String... urls) {
            String urlDisplay = urls[0];
            Bitmap myImage = null;
            try {
                InputStream in = new java.net.URL(urlDisplay).openStream();
                myImage = BitmapFactory.decodeStream(in);
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return myImage;
        }

        protected void onPostExecute(Bitmap result) {
            bmImage.setImageBitmap(result);
        }
    }
}
...