2015-09-14 166 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

相关问题