Android-Universal-Image-Loader icon indicating copy to clipboard operation
Android-Universal-Image-Loader copied to clipboard

Problem with first image of a listview (Version 1.8.4).

Open razi429 opened this issue 11 years ago • 12 comments

Hi There! This issue was raised earlier as well - Issue #83 It was updated that the issue was solved, but then am facing the same issue in ver1.8.4 again. First image in a list doesn't get displayed when the activity having the list is visited 2nd time. Noted one thing that this issue is happening only when I have some invalid image links for other images in the list. If all the image links are fine, then everything gets displayed absolutely fine.

Note : This issue gets replicated even in the Demo shared with the package. Just replaced the first 5 links in the IMAGES array of Constants class as below.

https://lh6.googleusercontent.com/-jZgveEqb6pg/T3R4kXScycI/AAAAAAAAAE0/xQ7CvpfXDzc/s1024/sample_image_01.jpg

http://wrong.site.com/corruptedLink

http://wrong.site.com/corruptedLink

https://lh6.googleusercontent.com/-jZgveEqb6pg/T3R4kXScycI/AAAAAAAAAE0/xQ7CvpfXDzc/s1024/sample_image_04.jpg

http://wrong.site.com/corruptedLink

Please Help. Thanks in advance.

razi429 avatar Jun 16 '13 08:06 razi429

Guys! can someone please help me out of this.. my development is kinda stuck because of this issue. Please help. Thanks!

razi429 avatar Jun 25 '13 15:06 razi429

Show your code.

nostra13 avatar Jun 28 '13 22:06 nostra13

package com.xapp.pkg;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;

import com.xapp.pkg.R;

import android.app.ActionBar;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageLoadingListener;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.xapp.lib.AbsListViewBaseActivity;
import com.xapp.lib.AppConstants;
import com.xapp.lib.DatabaseHandler;
import com.xapp.lib.HelperFunctions;
import com.xapp.lib.Poll;

public class FriendsActivity extends AbsListViewBaseActivity {


    int followedCount = 0;
    DisplayImageOptions options;

    //String[] imageUrls;

    ProgressDialog dialog = null;
    String userId = null;
    ArrayList followedUsers = null;


    // load frends only once - i-e wen the friend list shows 0 frends.
    // check if the images are geting updated.
    // back button
    // items display shud b updated.

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.poll_list);

          ActionBar ab = getActionBar();
          ab.setDisplayHomeAsUpEnabled(true);
          ab.setTitle("Friends");

        Bundle bundle = getIntent().getExtras();
        //imageUrls = bundle.getStringArray(Extra.IMAGES);

        DatabaseHandler db = new DatabaseHandler(getApplicationContext());
        HashMap userMap = db.getUserDetails();
        userId = (String)userMap.get("uid");



        dialog = new ProgressDialog(this);
        // make the progress bar cancelable
        dialog.setCancelable(false);
        // set a message text
        dialog.setMessage("Looking for the people you follow!");

        options = new DisplayImageOptions.Builder()
            .showStubImage(R.drawable.ic_empty)
            .showImageForEmptyUri(R.drawable.ic_empty)
            .showImageOnFail(R.drawable.ic_stub)
            .cacheInMemory()
            .cacheOnDisc()
            .displayer(new RoundedBitmapDisplayer(3))
            .build();

        if(!AppConstants.ImageLdrConfigInitiated)
        {
            ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
            .threadPriority(Thread.NORM_PRIORITY - 2)
            .denyCacheImageMultipleSizesInMemory()
            .discCacheFileNameGenerator(new Md5FileNameGenerator())
            .tasksProcessingOrder(QueueProcessingType.LIFO)
            .enableLogging() // Not necessary in common
            .build();
            // Initialize ImageLoader with configuration.
            ImageLoader.getInstance().init(config);

            AppConstants.ImageLdrConfigInitiated = true;
        }

        listView = (ListView) findViewById(R.id.poll_list);
        ProgressBar pBarUnused = (ProgressBar) findViewById(R.id.progress);
        pBarUnused.setVisibility(View.GONE);


        followedUsers = db.getFollowedUsers();
        followedCount = followedUsers.size();

        if(followedCount ==0)
        {
            // no frends.. check on the server.
            dialog.show();
            new LoadFollowedUsersTask().execute(userId,getApplicationContext());
        }
        else
        {
            // already has some frends loaded. no need to goto server.
            prepareMainList();
            //dialog.show();
            //new LoadFollowedUsersTask().execute(userId,getApplicationContext());
        }


    }


    private class LoadFollowedUsersTask extends AsyncTask<Object, Object, Object> {

        @Override
        protected Object doInBackground(Object... arg) {
            Log.e("Test23", ":::");

            Context context = (Context)arg[1];
            HelperFunctions ilf = new HelperFunctions();

            String userId = (String)arg[0];
            boolean loadingDone = ilf.loadFollowedUsers(userId,context);

            return new Boolean(loadingDone);
        }

        protected void onPostExecute(Object loadingDone) {

            if(((Boolean)loadingDone).booleanValue())
            {
                DatabaseHandler db = new DatabaseHandler(getApplicationContext());
                followedUsers = db.getFollowedUsers();
                followedCount = followedUsers.size();
                dialog.dismiss();
                prepareMainList();
            }
            else
            {
                dialog.dismiss();
                ((TextView)findViewById(R.id.noPollsMsg)).setVisibility(View.VISIBLE);
                Toast.makeText(FriendsActivity.this,"Oops! Some problem.", Toast.LENGTH_SHORT).show();
            }

            // goto poll page or result page.
            //view.postInvalidate();
         }

    }


    public void prepareMainList()
    {
        //followedCount=5;
        if(followedCount>0)
        {
            //findViewById(id);
            for(int i=0;i<followedUsers.size();i++)
            {
                String ar[]  =(String[])followedUsers.get(i);
                Log.e("ID CHECK",(String)ar[0]);
            }

            ((ListView) listView).setAdapter(new ItemAdapter(getApplicationContext(),followedUsers));
            listView.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    startProfileActivity(position);
                }
            });
        }
        else
        {
            ((TextView)findViewById(R.id.noPollsMsg)).setVisibility(View.VISIBLE);
        }

    }



    @Override
    public void onBackPressed() {
        AnimateFirstDisplayListener.displayedImages.clear();
        super.onBackPressed();
    }

     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
         case android.R.id.home:
             onBackPressed();
             break;
         default:
             return super.onOptionsItemSelected(item);
         }
         return true;
     }


    private void startProfileActivity(int position) {
        //Intent intent = new Intent(this, ImagePagerActivity.class);
        //intent.putExtra(Extra.IMAGES, imageUrls);
        //intent.putExtra(Extra.IMAGE_POSITION, position);
        //startActivity(intent);
    }

    class ItemAdapter extends BaseAdapter {

        ArrayList followedUserList = null;
        public ItemAdapter(Context context, 
                ArrayList followedUserList) {
               super();
               this.followedUserList = new ArrayList();
               this.followedUserList.addAll(followedUserList);
              }

        private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();

        private class ViewHolder {
            public TextView text;
            public ImageView image;
        }

        @Override
        public int getCount() {
            return followedCount;
        }

        @Override
        public Object getItem(int position) {
            return position;
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            View view = convertView;
            final ViewHolder holder;
            if (convertView == null) {
                view = getLayoutInflater().inflate(R.layout.friend_list_item, parent, false);
                holder = new ViewHolder();
                holder.text = (TextView) view.findViewById(R.id.text);
                holder.image = (ImageView) view.findViewById(R.id.image);
                view.setTag(holder);
            } else {
                holder = (ViewHolder) view.getTag();
            }

            String arr[] = (String[])followedUserList.get(position);
            holder.text.setText((String)arr[1]);

            Log.e("CURRENT POSITION",position+"");
            Log.e("CURRENT LINK",AppConstants.ThumbImgUrl+(String)arr[0]+".png");

            imageLoader.displayImage(AppConstants.ThumbImgUrl+(String)arr[0]+".png", holder.image, options, animateFirstListener);

            return view;
        }
    }

    private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener {

        static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());

        @Override
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
            if (loadedImage != null) {
                ImageView imageView = (ImageView) view;
                boolean firstDisplay = !displayedImages.contains(imageUri);
                if (firstDisplay) {
                    FadeInBitmapDisplayer.animate(imageView, 500);
                    displayedImages.add(imageUri);
                }
            }
        }
    }
}

razi429 avatar Jul 01 '13 12:07 razi429

This is the activity which uses UIL to display a list with images. Please let me know if anything else is needed to figure out the issue. Just want to reiterate that am seeing the same issue even in the sample project shared as a part of the released package. Thanks!

razi429 avatar Jul 01 '13 12:07 razi429

Any clue..?! Am not sure how others are not facing this issue!

razi429 avatar Jul 08 '13 11:07 razi429

Actually I can't reproduce your problem. Can you make a video of that?

nostra13 avatar Jul 09 '13 15:07 nostra13

Same problem. When you scroll really fast, some item show wrong pics.

Here is my getView method. Every item has four Imageview to show image.

    @Override
    public View getView(final int position, View convertView, ViewGroup parent){
        View view = convertView;
        final ItemViewHolder holder;
        if(convertView==null){
            holder=new ItemViewHolder();
            view=inflater.inflate(R.layout.gamelist_item,parent,false);
            holder.siteNameTextView=(TextView)view.findViewById(R.id.site_name);
            holder.avatar1ImageView=(ImageView)view.findViewById(R.id.avatar1);
            holder.avatar2ImageView=(ImageView)view.findViewById(R.id.avatar2);
            holder.avatar3ImageView=(ImageView)view.findViewById(R.id.avatar3);
            holder.avatar4ImageView=(ImageView)view.findViewById(R.id.avatar4);
            holder.memoTextView=(TextView)view.findViewById(R.id.memo);
            view.setTag(holder);
        }else{
            holder=(ItemViewHolder)view.getTag();
        }

            holder.siteNameTextView.setText(mGames[position].site.name);

            mImageLoader.displayImage(mGames[position].owner.icon,holder.avatar1ImageView, options, mIconDisplayListener);

            ArrayList<Participant> allowParticipants=participantsList.get(position);
            if(allowParticipants.size()==1){
                mImageLoader.displayImage(allowParticipants.get(0).user.icon,holder.avatar2ImageView,options,mIconDisplayListener);
            }else if(allowParticipants.size()==2){
                mImageLoader.displayImage(allowParticipants.get(0).user.icon,holder.avatar2ImageView,options,mIconDisplayListener);
                mImageLoader.displayImage(allowParticipants.get(1).user.icon,holder.avatar3ImageView,options,mIconDisplayListener);
            }else if(allowParticipants.size()==3){
                mImageLoader.displayImage(allowParticipants.get(0).user.icon,holder.avatar2ImageView,options,mIconDisplayListener);
                mImageLoader.displayImage(allowParticipants.get(1).user.icon,holder.avatar3ImageView,options,mIconDisplayListener);
                mImageLoader.displayImage(allowParticipants.get(2).user.icon,holder.avatar4ImageView,options,mIconDisplayListener);
            }

        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                gotoGameDetailActivity(position);
            }
        });

        return view;
    }

skyfishjy avatar Jul 18 '13 18:07 skyfishjy

I have the same problem, here is my BaseAdapter of the ListView.

public class ImageAdapter extends BaseAdapter {

    private ImageAdapterViewCollection images;
    private ImageLoader imageLoader;
    private ImageView imageView;
    protected Context context;

    public ImageAdapter(Context context, ImageLoader imageLoader,
            ImageAdapterViewCollection images) {
        super();
        this.images = images;
        this.context = context;
        this.imageLoader = imageLoader;
    }

    @Override
    public int getCount() {
        return images.size();
    }

    @Override
    public ImageAdapterView getItem(int arg0) {
        return images.get(arg0);
    }

    @Override
    public long getItemId(int arg0) {
        return images.get(arg0).getUid();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        imageView = (ImageView) convertView;

        if (imageView == null) {
            imageView = (ImageView) inflater.inflate(
                    R.layout.item_gallery_image, parent, false);
        }
        imageLoader.displayImage(images.get(position).getUrl(), imageView);
        System.out.println(position);

        return imageView;
    }
}

frankred avatar Oct 16 '13 22:10 frankred

Closing old issues... Will reopen if necessary.

nostra13 avatar Dec 01 '13 11:12 nostra13

I have installed the latest version, but the result remains the same

please fixed this issue

thanks

massusant avatar Dec 10 '13 10:12 massusant

I need a detail description of the problem and a video (it's desirable).

nostra13 avatar Dec 24 '13 21:12 nostra13

For those who still facing with this problem on version 1.9.5. Please add following code snippet above the line that you set default image for null returned bitmap in recyclerview. ImageLoader.getInstance().cancelDisplayTask(imageView); imageView.setImageResource(..default image)

luantc avatar Mar 27 '18 06:03 luantc