2015-09-14 163 views
0

我正在使用通用圖像加載器來顯示來自web的listview圖像。但在加載時,一個圖像項目會顯示其他圖像項目。經過一段時間後,它完全加載它顯示的確切圖像。它有時看起來很尷尬 - 一個人顯示另一個男人的照片。提前致謝。 我的適配器代碼:通用圖像加載器在Android中加載時顯示不同的圖像

公共類EmployeeAdapter延伸BaseAdapter實現的可篩選{

private ArrayList<EmployeeObj> mOriginalValues; // Original Values 
    private ArrayList<EmployeeObj> mDisplayedValues; // Values to be 
    private ImageLoader imageLoader; // displayed 
    LayoutInflater inflater; 

    public EmployeeAdapter(Context context, 
      ArrayList<EmployeeObj> mProductArrayList) { 
     this.mOriginalValues = mProductArrayList; 
     this.mDisplayedValues = mProductArrayList; 
     inflater = LayoutInflater.from(context); 
     imageLoader = ImageLoader.getInstance(); 
    } 

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

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

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

    private class ViewHolder { 
     LinearLayout llContainer; 
     TextView employeeName, employeeDesignation; 
     Button callButton; 
     ImageView imageView; 
    } 

    @Override 
    public View getView(final int position, View convertView, 
      ViewGroup parent) { 

     ViewHolder holder = null; 

     if (convertView == null) { 

      holder = new ViewHolder(); 
      convertView = inflater.inflate(R.layout.employee_row, null); 
      holder.llContainer = (LinearLayout) convertView 
        .findViewById(R.id.searchListView); 
      holder.employeeName = (TextView) convertView 
        .findViewById(R.id.listTitle); 
      holder.employeeDesignation = (TextView) convertView 
        .findViewById(R.id.listDesignation); 

      holder.callButton = (Button) convertView 
        .findViewById(R.id.listButton); 

      holder.imageView = (ImageView) convertView 
        .findViewById(R.id.listImage); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     String addEmployeeName = mDisplayedValues.get(position) 
       .getEmployeeName(); 

     if (addEmployeeName.length() >= 20) { 
      addEmployeeName = addEmployeeName.substring(0, 20); 
      addEmployeeName = addEmployeeName + "....."; 
     } 
     holder.employeeName.setText(addEmployeeName); 

     holder.employeeDesignation.setText(mDisplayedValues.get(position) 
       .getEmployeeDesignation()); 

     // holder.employeeMobile.setText("01722761395"); 
     // holder.employeeDesignation.setText(mDisplayedValues.get(position) 
     // .getEmployeeDesignation()); 


     holder.callButton.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       // Toast.makeText(getApplicationContext(), "Done", 
       // Toast.LENGTH_SHORT).show(); 
       // int position=(Integer)adapter. 
       // Log.e("position==",position+""); 
       pos = position; 

       dialog.show(); 
      } 
     }); 

     String path = mDisplayedValues.get(position).getImagePath(); 

     if (path.length() <= 5) { 

     } else { 

      DisplayImageOptions options = new DisplayImageOptions.Builder() 
        .cacheOnDisc().cacheInMemory().build(); 
      imageLoader.displayImage(path, holder.imageView, options); 
     } 
     convertView.setBackgroundColor(position % 2 == 0 ? Color 
       .parseColor("#ffffff") : Color.parseColor("#ffffff")); 
     return convertView; 
    } 
+0

請分享一些代碼! – QAMAR

+0

顯示您的適配器代碼 –

+0

Brother我已編輯添加適配器代碼 –

回答

1

這是由於UIL重用的事實的ImageView時,他們不再被看到。假設您的屏幕可以同時顯示3張圖像,當頂部或底部圖像不在屏幕上時(取決於向上或向下滾動),圖像視圖將被重新使用以加載您將顯示的下一幅圖像。

所以,如果你已經配置UIL加載新圖像的同時加載3圖像,你會選擇舊的,因爲imageView被重用。所以最好的辦法是設置一些足夠大的加載圖像,以便UIL有時間在加載新圖像之前加載它們。

不知道我是否足夠清楚。告訴我你是否需要更多的解釋。

編輯:

您需要通過調用threadPoolSize()設置圖像的最大數量要加載設置池的大小。

public class testApplication extends Application { 
    Context mContext; 

    public void onCreate() { 
     super.onCreate(); 
     mContext = getApplicationContext(); 
     DisplayImageOptions options = new DisplayImageOptions.Builder() 
       .delayBeforeLoading(0) 
       .resetViewBeforeLoading(true) 
       .cacheInMemory(true) 
       .cacheOnDisk(true) 
       .bitmapConfig(Bitmap.Config.RGB_565) 
       .imageScaleType(ImageScaleType.EXACTLY) 
       .build(); 

     ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(mContext) 
       .denyCacheImageMultipleSizesInMemory() 
       .defaultDisplayImageOptions(options) 
       .diskCacheExtraOptions(480, 320, null) 
//    .memoryCacheSize(41943040) 
       .threadPoolSize(10) 
       .build(); 

     ImageLoader.getInstance().init(config); 
    } 
} 

在上面的例子中,我加載了10張圖片(即使10張圖片沒有同時顯示)。

另一件事,如果你真的不希望舊圖像顯示在新的加載之前,你可以在您的DisplayImageOptions設置.resetViewBeforeLoading(true)

最後。如果你得到out of memory error,read this(點4)

+0

的問題感謝您的解釋。我意識到這一點。但我怎樣才能設置圖像的數量加載? –

+0

.resetViewBeforeLoading(true)對我來說是完美的解決方案。謝謝哥們... – Nitin

相關問題