2015-05-30 13 views
8

मैं अपनी कस्टम 3 डी गैलरी प्रदर्शित करने के लिए fancyCoverFlow और universalImageLoader का उपयोग कर रहा हूं: डी नीचे चित्र की तरह कुछ। मेरी समस्या यह है कि जब तक मैं गैलरी चित्रों के बीच स्वाइप नहीं करता तब तक चित्रों को तब तक नहीं दिखाता जब तक कि मैं गैलरी चित्रों के बीच स्वाइप नहीं करता और अगली बार जब यह छवि दिखा रहा हो तब दिखाई देता है लेकिन यूनिवर्सल इमेजलोडर के नमूने में डाउनलोड की गई छवि डाउनलोड करने के ठीक बाद दिखाती है।कवरफ्लो और यूनिवर्सल छवि लोडर का मिश्रण

public View getView(int position, View view, ViewGroup parent) { 


    RoundedImageView photo = (RoundedImageView) view; 
    if (photo == null) { 
     photo = (RoundedImageView) inflater.inflate(R.layout.row_gallery_latest_issue_item, parent, false); 
    } 
    try { 
     System.out.println("Test is good"); 
     ImageLoaderHelper.configureCacheableImage(mContext, photo, latestBook.get(position).getImageUrl(), 
       R.drawable.avatar_issue, null); 
    } catch (NullPointerException e) { 
     photo.setImageResource(R.drawable.avatar_issue); 
     e.printStackTrace(); 
    } 

    return createReflectedImages(photo); 
} 

यह UniversalImageLoader नमूना के रूप में बिल्कुल वैसा ही है उम्मीद मैं एक TryCatche और CreateReflectedImage

(जो हमारे imageView चिंतनशील बनाने), एक बात और मेरी ImageLoaderHelper है:

यहाँ एडाप्टर के लिए मेरे getView कोड है है:

public class ImageLoaderHelper { 
public static void configureCacheableImage(Context context, ImageView imageView 
     , String imageUrl, Integer defaultImageResourceId 
     , ImageLoadingListener imageLoadingListener) { 
    ImageLoader imageLoader = ImageLoader.getInstance(); 
    DisplayImageOptions.Builder builder = new DisplayImageOptions.Builder(); 
    builder.displayer(
      new SimpleBitmapDisplayer()) 
      .cacheOnDisc(true) 
      .cacheInMemory(true) 
      .resetViewBeforeLoading(true) 
      .imageScaleType(ImageScaleType.IN_SAMPLE_INT) 
      .bitmapConfig(Bitmap.Config.RGB_565); 
    if (defaultImageResourceId != null) 
     builder.showImageOnFail(defaultImageResourceId).showImageForEmptyUri(defaultImageResourceId).showStubImage(defaultImageResourceId); 
    if (!imageLoader.isInited()) 
     imageLoader.init(ImageLoaderConfiguration.createDefault(context)); 
    imageLoader.displayImage(imageUrl, imageView, builder.build(), imageLoadingListener); 
} 

}

enter image description here

अद्यतन:

एक दिन डिबगिंग के बाद मैं एक सुराग मिला समस्या मेरे एडाप्टर के साथ है लेकिन मैं इसे कैसे हल करने के लिए पता नहीं है!

public ImageView createReflectedImages(RoundedImageView image) { 

    RoundedDrawable drawable = (RoundedDrawable) image.getDrawable(); 
    Bitmap originalImage = drawable.toBitmap(); 

    int width = originalImage.getWidth(); 
    int height = originalImage.getHeight(); 

    Matrix matrix = new Matrix(); 
    matrix.preScale(1, -1); 

    Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, 
      height/2, width, height/2, matrix, false); 

    Bitmap bitmapWithReflection = Bitmap.createBitmap(width, 
      (height + height/2), Config.ARGB_8888); 

    Canvas canvas = new Canvas(bitmapWithReflection); 

    canvas.drawBitmap(originalImage, 0, 0, null); 

    canvas.drawBitmap(reflectionImage, 0, height, null); 

    Paint paint = new Paint(); 
    LinearGradient shader = new LinearGradient(0, height, 0, bitmapWithReflection.getHeight() 
      , 0x70ffffff, 0x00ffffff, TileMode.CLAMP); 

    paint.setShader(shader); 

    paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); 

    canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() 
      , paint); 

    RoundedImageView imageView = new RoundedImageView(mContext); 
    imageView.setImageBitmap(bitmapWithReflection); 
    imageView.setLayoutParams(new ImageGallery3D.LayoutParams(GeneralHelper.dp(180), GeneralHelper.dp(240)));//width and height of Image 
    return imageView; 
} 
+0

प्रदर्शन ImageOptions.Bilder विधि से बाहर बेहतर स्थानांतरित करें और इसे कहीं और शुरू करें, यह हर नई पंक्ति के निर्माण के लिए बनाया जा रहा है। आप छवि लोडिंग लिस्टनर को यह भी जांचने के लिए सेट कर सकते हैं कि छवि डाउनलोड हो गई है या नहीं। – razzledazzle

+0

@razzledazzle आपके सुझाव के लिए धन्यवाद मैं DisplayImageOptions.builder को ठीक करता हूं, मेरी समस्या को हल नहीं करता क्योंकि जब मैं ऐप बंद करता हूं (गतिविधि को नष्ट करता हूं) और फिर गतिविधि गैलरी शुरू करता हूं कैश किए गए चित्रों को डाउनलोड नहीं किया गया था। – Amir

उत्तर

1

समस्या आप imageView के 2 अलग उदाहरणों के आसपास चल है कि है:

यहाँ) CreateReflectedImages (का कोड है। 1 getView में बनाया गया है, और दूसरा createReflectedImage में बनाया गया है। तो मूल रूप से, जब छवि डाउनलोड करना समाप्त हो जाती है, तो एक नया छविदृश्य पहले ही इसे बदल चुका है और डाउनलोड की गई छवि को उस में लोड किया गया है जो अब दिखाई नहीं दे रहा है (या संभवतः यहां तक ​​कि मौजूद है)। दूसरी बार सही तरीके से लोड होने का कारण यह है कि (ऑफस्क्रीन स्क्रॉल करने के बाद) यह है कि विलंबता बहुत कम है क्योंकि इसे वेब से या कहीं भी स्मृति से लोड नहीं किया जा रहा है, इसलिए जब RoundedDrawable drawable = (RoundedDrawable) image.getDrawable(); वास्तव में प्लेसहोल्डर की बजाय, वास्तव में वह छवि है जिसे आप चाहते हैं!

public View getView(int position, View view, ViewGroup parent) { 


    RoundedImageView photo = (RoundedImageView) view; 
    ... 
     /* 
     *Passing first instance of photo into ImageLoaderHelper 
     */ 

    ImageLoaderHelper.configureCacheableImage(mContext, photo, latestBook.get(position).getImageUrl(), 
       R.drawable.avatar_issue, null); 
    ... 
    // 
    //Returns the new instance of RoundedImageView that ImageLoader is not aware of to the adapter 
    // 
    return createReflectedImages(photo); 
} 

public ImageView createReflectedImages(RoundedImageView image) { 
    ... 

    RoundedImageView imageView = new RoundedImageView(mContext); 
    imageView.setImageBitmap(bitmapWithReflection); 
    imageView.setLayoutParams(new ImageGallery3D.LayoutParams(GeneralHelper.dp(180), GeneralHelper.dp(240)));//width and height of Image 

    //Returning a new instance of imageView 
    return imageView; 
} 

छवि को वापस करने के बजाय createReflectedImages में देखें, छवि "वापस"। फिर उस छविबैक को कार्यान्वित करें जिसे आप ImageLoaderHelper में भेजते हैं जो आपके प्रभाव को लागू करने के लिए छवि सफलतापूर्वक लोड होने के बाद createReflectedImages को कॉल करता है।

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