6

का उपयोग करके पहले से लोड की गई छवियों की सूची दृश्य पुनः लोड करना मेरे एंड्रॉइड प्रोजेक्ट में मैं इस उद्देश्य के लिए web service(Url) से ListView से सभी छवियां दिखा रहा हूं, मैंने Universal image loader का उपयोग किया है। सूची में कुछ छवियों को लोड करने के बाद यदि मैं नीचे स्क्रॉल करता हूं तो स्क्रॉल किया जाता है, पहले से लोड की गई छवियां फिर से लोड हो रही हैं।यूनिवर्सल छवि लोडर

DisplayImageOptions.Builder displayImageOptionsBuilder = new DisplayImageOptions 
        .Builder().cacheOnDisk(true).cacheInMemory(true).considerExifParams(true); 


ImageLoader.getInstance().displayImage(imageUri, imageView, 
        displayImageOptionsBuilder.build()); 

मैं क्या करने की कोशिश की

ImageAware imageAware = new ImageViewAware(imageView, false); 
      ImageLoader.getInstance().displayImage(imageUri, imageAware,displayImageOptionsBuilder.build()); 

यहां तक ​​कि इस कोड यह ListView में कोई परिवर्तन नहीं होगा इस्तेमाल किया reloading

संपादित

एडाप्टर कक्षा

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     final String name = getItem(position); 
     View view = convertView;  

     if (view == null) { 
      view = createView(); 
      ViewHolder viewHolder = new ViewHolder();  
      viewHolder.image = (ImageView) view.findViewById(R.id.capsule_media_list_item_thumbnail_1);    
      view.setTag(viewHolder);  
     } 

ImageHelper.initImage(viewHolder.image, 
       imageUrl, 
       R.drawable.vx_loading, loadingImageResource,displayOptionsCustomizer); 

return view; 
} 

private final DisplayOptionsCustomizer displayOptionsCustomizer = new DisplayOptionsCustomizer() { 

     @Override 
     public void customizeImageOptions(DisplayImageOptions.Builder displayImageOptionsBuilder) { 
      displayImageOptionsBuilder.displayer(new RoundedBitmapDisplayer(ApplicationUtils 
        .dipToPixelsRounded(6, getContext()), 0)); 
     } 
    };  

static class ViewHolder { 
     public ImageView image; 

    } 

ImageHelper.java

public static void initImage(final ImageView imageView, final String imageUri, 
           final int noImageResource, final int loadingImageResource, 
           final DisplayOptionsCustomizer displayOptionsCustomizer) { 
     if (StringUtils.isNotBlank(imageUri)) {    

      DisplayImageOptions.Builder displayImageOptionsBuilder = new DisplayImageOptions 
        .Builder().cacheOnDisk(true).cacheInMemory(true).considerExifParams(true); 
      displayImageOptionsBuilder.showImageOnLoading(loadingImageResource) 
        .showImageOnFail(noImageResource); 
      if (displayOptionsCustomizer != null) { 
       displayOptionsCustomizer.customizeImageOptions(displayImageOptionsBuilder); 
      } 


      ImageLoader.getInstance().displayImage(imageUri, imageView, 
        displayImageOptionsBuilder.build()); 
     } else { 
      if (noImageResource != 0) { 
       imageView.setImageResource(noImageResource); 
      } else { 
       imageView.setVisibility(View.GONE); 
      } 
     } 
    } 

संपादित एडाप्टर वर्ग के रूप में प्रति Dhir Pratapजवाब

public class ImagesListAdapter extends ArrayAdapter<String> { 

private List imagesList = new ArrayList<String>(); 
private Context context; 
ImageLoader imageLoader; 
DisplayImageOptions options; 

public ImagesListAdapter(Context context, List<String> imagesList) { 
     super(context, -1,imagesList); 
     this.imagesList = imagesList; 
     this.context = context; 
imageLoader = ImageLoader.getInstance(); 
options = new DisplayImageOptions.Builder().cacheInMemory(true) 
     .cacheOnDisk(true).resetViewBeforeLoading(true) 
     .showImageForEmptyUri(fallbackImage) 
     .showImageOnFail(fallbackImage) 
     .showImageOnLoading(fallbackImage).build(); 

    }  

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     final String name = getItem(position); 
     View view = convertView;  
ViewHolder viewHolder; 

     if (view == null) { 
      view = createView(); 
      viewHolder = new ViewHolder();  
      viewHolder.image = (ImageView) view.findViewById(R.id.capsule_media_list_item_thumbnail_1);    
      view.setTag(viewHolder);  
     } 
else{ 

viewHolder = (ViewHolder) view.getTag(viewHolder); 
} 

/*ImageHelper.initImage(viewHolder.image, 
       imageUrl, 
      R.drawable.vx_loading, loadingImageResource,displayOptionsCustomizer);*/ 

imageLoader.displayImage(imageUrl,viewHolder.image, 
      options); 

return view; 
} 

/* private final DisplayOptionsCustomizer displayOptionsCustomizer = new DisplayOptionsCustomizer() { 

     @Override 
     public void customizeImageOptions(DisplayImageOptions.Builder displayImageOptionsBuilder) { 
      displayImageOptionsBuilder.displayer(new RoundedBitmapDisplayer(ApplicationUtils 
        .dipToPixelsRounded(6, getContext()), 0)); 
     } 
    }; */ 

static class ViewHolder { 
     public ImageView image; 

    } 

} 
+0

आपका प्रश्न अस्पष्ट है ... आपने एडाप्टर के getView में ImageLoader का उपयोग कैसे किया? छवियां कितनी बड़ी हैं (यह महत्वपूर्ण है क्योंकि स्मृति लोडर कम होने पर छवि लोडर कैश किए गए बिटमैप्स को छोड़ सकते हैं - इसलिए इसे डिस्क कैश से या यहां तक ​​कि इंटरनेट से भी रीयलोड करना होगा (अगला प्रश्न देखें))? सर्वर भी ई-टैग (या अन्य कैशिंग हेडर) का उपयोग करता है? – Selvin

+0

@ सेल्विन मैंने एडाप्टर क्लास getView() विधि के साथ भी अपना प्रश्न संपादित किया है। – Jamal

+0

छवि आकार भिन्न हैं, प्रत्येक छवि के आकार का आकार है। वे 14.1 केबी, 13.2 केबी, 27 केबी, 23.4 केबी, 11 केबी आदि – Jamal

उत्तर

12

कुछ फिक्स कर रहे हैं आप

कर सकते हैं
  1. आपका व्यू धारक लगभग बेकार है। आप आप केवल एक बार ImageLoader और DisplayImageOptions उदाहरण घोषित करना चाहिए का पालन के रूप में

    ViewHolder viewHolder; 
    if (view == null) { 
        viewHolder = new ViewHolder();  
        viewHolder.image = (ImageView) view.findViewById(R.id.capsule_media_list_item_thumbnail_1);    
        view.setTag(viewHolder);  
    }else{ 
    viewHolder = view.getTag(viewHolder); 
    } 
    
  2. इसका इस्तेमाल करने के लिए है। शायद कन्स्ट्रक्टर में।

    ImageLoader imageLoader = ImageLoader.getInstance(); 
    DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true) 
         .cacheOnDisc(true).resetViewBeforeLoading(true) 
         .showImageForEmptyUri(fallbackImage) 
         .showImageOnFail(fallbackImage) 
         .showImageOnLoading(fallbackImage).build(); 
    
  3. प्राप्त ध्यान में रखते हुए आप बस छवि को लोड के रूप में पालन

संपादित करें: मैं इस्तेमाल नहीं किया था ImageAware। आपको इस तरह उपयोग करना होगा।

ImageAware imageAware = new ImageViewAware(viewHolder.image, false); 
imageLoader.displayImage(imageUri, imageAware,options); 

यहाँ The answer का कहना है कि यह वास्तव में UIL के साथ एक समस्या है जो संस्करण 1.9 में तय किया गया था।

संपादित करें 2: मैं Github पर इस मुद्दे पर चर्चा का पालन किया और this answer जो छवि यूआरएल पर मैनुअल चेकिंग करता पाया। यह निम्नलिखित

//lets prevent "blinking" by "saving URL tag" hack 

    if (viewHolder.image.getTag() == null || 
      !viewHolder.image.getTag().equals(imageUri)) { 

     //we only load image if prev. URL and current URL do not match, or tag is null 

     ImageAware imageAware = new ImageViewAware(viewHolder.image, false); 
     imageLoader.displayImage(imageUri, imageAware,options); 
     viewHolder.image.setTag(imageUri); 
    } 
+1

धीर प्रताप पर कैशिंग सक्षम है, मैंने आपके कोड की कोशिश की है लेकिन फिर भी यह समस्या होती है। 'कैशऑनडिस्क (सत्य) 'विधि' बहिष्कृत 'है इसलिए मैंने' कैशऑनडिस्क (सत्य)' – Jamal

+0

के साथ प्रयास किया है क्या आप परिवर्तनों के साथ प्रश्न अपडेट कर सकते हैं, फिर मैं आगे देख सकता हूं। –

+0

मैंने अपना 'एडाप्टर' वर्ग – Jamal

0

मुझे एक ही समस्या है। Src फ़ोल्डर में ApplicationClass.java फ़ाइल डालना और इसे प्रकट फ़ाइल में पंजीकृत करना आपकी समस्या का समाधान करेगा।

यहां दोनों फाइलें हैं:

एप्लिकेशन क्लास।जावा

package yourPackageName; 

import android.app.Application; 

import com.nostra13.universalimageloader.cache.memory.impl.WeakMemoryCache; 
import com.nostra13.universalimageloader.core.DisplayImageOptions; 
import com.nostra13.universalimageloader.core.ImageLoader; 
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; 
import com.nostra13.universalimageloader.core.assist.ImageScaleType; 
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; 

public class ApplicationClass extends Application 
{ 
    @Override 
    public void onCreate() { 
     super.onCreate(); 

     // UNIVERSAL IMAGE LOADER SETUP 
     DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder().cacheOnDisc(true).cacheInMemory(true) 
       .imageScaleType(ImageScaleType.EXACTLY).displayer(new FadeInBitmapDisplayer(300)).build(); 

     ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()) 
       .defaultDisplayImageOptions(defaultOptions).memoryCache(new WeakMemoryCache()) 
       .discCacheSize(100 * 1024 * 1024).build(); 

     ImageLoader.getInstance().init(config); 
     // END - UNIVERSAL IMAGE LOADER SETUP 
    } 
} 

मालसूची फ़ाइल:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="yourPackageName"> 

    <!--Permissions --> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

    <application 
    android:name="com.webcluesinfotech.loadimagefromurlinlistview.ApplicationClass" 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme.NoActionBar"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

आशा यह आप में मदद मिलेगी।

संबंधित मुद्दे