Picasso: Bereits heruntergeladene Bilder verschwinden beim Scrollen in der Listenansicht nach oben, lädt langsam

Erstellt am 13. Jan. 2015  ·  6Kommentare  ·  Quelle: square/picasso

Hallo allerseits,

Meine Listenansicht lädt Picasso-Bilder langsam. Ich muss oft warten, um ein Bild herunterzuladen, ein wenig scrollen und warten, um das nächste Bild in der Listenansicht herunterzuladen, es funktioniert nicht im Voraus.

Heruntergeladene Bilder verschwinden auch, wenn ich wieder nach oben scrolle. Es fühlt sich an, als würde Picasso nur 4-5 Bilder gleichzeitig laden und die bereits geladenen ersetzen, um Platz zu schaffen. Hier ist (http://i.imgur.com/SvzGWLI.png), wie mein Gedächtnis gerade aussieht, wenn ich nach oben und unten scrolle und auf das Laden der Bilder warte.

public class MainActivity extends Activity {
    private List<Post> myPosts = new ArrayList<Post>();
    protected String[] mBlogPostTitles;
    public static final String TAG = MainActivity.class.getSimpleName();

    ...

    private void populateListView() {
        Activity activity = MainActivity.this;

        ArrayAdapter<Post> adapter = new MyListAdapter();
        ListView list = (ListView) findViewById(R.id.postsListView);
        list.setAdapter(adapter);
        list.setOnScrollListener(new SampleScrollListener(activity));
    }

    private class MyListAdapter extends ArrayAdapter<Post>{
        public MyListAdapter() {
            super(MainActivity.this, R.layout.item_view, myPosts);
        }

        <strong i="8">@Override</strong>
        public int getViewTypeCount() {
            return 2;
        }

        <strong i="9">@Override</strong>
        public int getItemViewType(int position) {
            String imageURL = myPosts.get(position).getImage();
            if(imageURL == null || imageURL.isEmpty()){
                return 1; // text based
            }else{
                return 0; // image based
            }
        }

        <strong i="10">@Override</strong>
        public View getView(int position, View convertView, ViewGroup parent) {

            PostViewHolder holder;

            int type = getItemViewType(position);

            View itemView = convertView;

            // make sure we have a view to work with
            if (itemView == null) {
                holder = new PostViewHolder();
                if(type == 1) {
                    itemView = getLayoutInflater().inflate(R.layout.item_view, parent, false);
                }else {
                    itemView = getLayoutInflater().inflate(R.layout.image_post_view, parent, false);
                    holder.image = (ImageView) itemView.findViewById(R.id.item_image);
                }
                holder.user = (TextView) itemView.findViewById(R.id.item_txtUser);
                holder.time = (TextView) itemView.findViewById(R.id.item_txtTime);
                holder.post = (TextView) itemView.findViewById(R.id.item_txtPost);
                holder.likes = (TextView) itemView.findViewById(R.id.item_txtLikes);

                itemView.setTag(holder);
            } else {
                holder = (PostViewHolder) itemView.getTag();
            }

            //find the post to work with
            Post currentPost = myPosts.get(position);

            if(type != 1) {
                Context context = itemView.getContext();
                String imageURL = currentPost.getImage();

                Picasso.with(context).setIndicatorsEnabled(true);
                //Picasso.with(context).setLoggingEnabled(true);
                Picasso.with(context)
                        .load(imageURL)
                        .tag(context)
                        .placeholder(R.drawable.kanye8080s)
                        //.skipMemoryCache()
                        .error(R.drawable.stadiumarcadium)
                        .fit()
                        .into(holder.image);
            }
            //Username
            holder.user.setText(currentPost.getUser());

            //Time of post
            holder.time.setText("" + currentPost.getTime());

            //The actual post
            holder.post.setText(currentPost.getPost());

            //Likes for the post
            holder.likes.setText("" + currentPost.getLikes());

            return itemView;
        }
    }
    public class SampleScrollListener implements AbsListView.OnScrollListener {
        private final Context context;

        public SampleScrollListener(Context context) {
            this.context = context;
        }

        <strong i="11">@Override</strong>
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            final Picasso picasso = Picasso.with(context);
            if (scrollState == SCROLL_STATE_IDLE || scrollState == SCROLL_STATE_TOUCH_SCROLL) {
                picasso.resumeTag(context);
            } else {
                picasso.pauseTag(context);
            }
        }

        <strong i="12">@Override</strong>
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
                             int totalItemCount) {
            // Do nothing.
        }
    }


    ...
} 

Ich habe dieses Problem bereits auf SO gepostet (http://stackoverflow.com/questions/27771646/picasso-keeps-reloading-images-while-scrolling-upwards-in-listview-loads-slowly), konnte aber keine Lösung finden . Ich habe mich gefragt, ob Sie mir als letzten Ausweg helfen könnten, es herauszufinden? Ich verwende bereits den Aufruf fit(), daher glaube ich nicht, dass es sich um ein Problem mit der Größenänderung handelt. Jede Hilfe wäre sehr dankbar, danke!

Hilfreichster Kommentar

rv.getRecycledViewPool().setMaxRecycledViews(0, 0);

Durch die Verwendung dieses wurde mein Problem gelöst

Alle 6 Kommentare

Sind die Quell-Bitmaps zu groß zum Herunterladen? Langsame Netzwerkverbindung?

Haben Sie eine andere Bibliothek zum Laden von Bildern versucht? Wenn Sie dies tun und es gut funktioniert, lassen Sie es mich bitte wissen und ich kann es mir ansehen. Ich habe das Gefühl, das ist nicht Picassos Schuld.

Fügen Sie eine URL ein, die Sie verwenden, oder eine Reihe davon, und ich werde sie in die Beispiel-App einfügen.

Ich habe das gleiche Problem bei weniger leistungsstarken Smartphones. Ich verwende das Recyclerview-Muster für die Liste und hatte definitiv eine bessere Cache-Leistung mit der Volley-Bibliothek: https://github.com/mcxiaoke/android-volley

rv.getRecycledViewPool().setMaxRecycledViews(0, 0);

Durch die Verwendung dieses wurde mein Problem gelöst

Bilder werden in der Recycleransicht neu geladen, sogar Volley mit der LruCache-Klasse?

@ raj9686 würden Sie mir bitte sagen, wo ich diese Leitung verwenden soll?

Verwenden Sie einfach Glide, es hat mein Problem gelöst und ist leicht zu ändern.

https://guides.codepath.com/android/Displaying-Images-with-the-Glide-v3-Library

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

austynmahoney picture austynmahoney  ·  5Kommentare

JakeWharton picture JakeWharton  ·  3Kommentare

ghost picture ghost  ·  5Kommentare

nitingrov86 picture nitingrov86  ·  4Kommentare

caoguodong picture caoguodong  ·  3Kommentare