Android-Universal-Image-Loader
Android-Universal-Image-Loader copied to clipboard
Problem with first image of a listview (Version 1.8.4).
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.
Guys! can someone please help me out of this.. my development is kinda stuck because of this issue. Please help. Thanks!
Show your code.
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);
}
}
}
}
}
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!
Any clue..?! Am not sure how others are not facing this issue!
Actually I can't reproduce your problem. Can you make a video of that?
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;
}
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;
}
}
Closing old issues... Will reopen if necessary.
I have installed the latest version, but the result remains the same
please fixed this issue
thanks
I need a detail description of the problem and a video (it's desirable).
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)