【问题标题】:Rendering a ListView with a background worker thread使用后台工作线程渲染 ListView
【发布时间】:2013-12-13 14:49:00
【问题描述】:

我是我的应用程序,我有一个 ListView,它有 2 个 TextViews 和 2 个 ImageViews,我注意到当我滚动它时,它并不完全流畅,我四处搜索并注意到我需要一个后台工作线程需要在我的 listView 中呈现我的 ImageViews。我试图实现它,但我做不到,因为我从我的线程内部引用 viewHolder 类,所以持有者需要是最终的,但这不可能发生,所以可能我做错了。有人有吗关于如何实现这一点的任何想法?提前谢谢你

   @Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    MonumentHolder holder = null;

    if(row == null){

        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        row = inflater.inflate(resource, parent, false);

        holder = new MonumentHolder();
        holder.imgIcon = (ImageView)row.findViewById(R.id.imageView3);
        holder.txtTitle = (TextView)row.findViewById(R.id.textView1);
        holder.marker =  (ImageView)row.findViewById(R.id.imageView2);
        holder.descr = (TextView)row.findViewById(R.id.textView2);

        row.setTag(holder);

    }
    else{

        holder = (MonumentHolder)row.getTag();

    }

    Monument monument = monuments.get(position);
    holder.txtTitle.setText(monument.getTitle());

    if(monument.getTitleOfCategory().equals("Βυζαντινά Μνημεία"))
        holder.marker.setImageResource(R.drawable.memorial);
    else if(monument.getTitleOfCategory().equals("Αρχαιολογικά Μνημεία"))
        holder.marker.setImageResource(R.drawable.ar);
    else if(monument.getTitleOfCategory().equals("Ιστορικά")) 
        holder.marker.setImageResource(R.drawable.hist);
    else
        holder.marker.setImageResource(R.drawable.museum);


    localPhotosUrl=monument.getLocalPhotosUrl();

    holder.imgIcon.setImageBitmap(null);

    if(!localPhotosUrl.isEmpty()){

        File picToLoad = new File(localPhotosUrl.get(0));
        byte[] lala = null;
        try {
            lala = org.apache.commons.io.FileUtils.readFileToByteArray(picToLoad);
            s(lala.length);
            System.gc();
            Bitmap bitmap = BitmapFactory.decodeByteArray(lala, 0, lala.length);

            holder.imgIcon.setImageBitmap(bitmap);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

    holder.descr.setText(monument.getContent());


    return row; 
}

【问题讨论】:

    标签: android android-listview


    【解决方案1】:

    我建议您使用Picasso 来加载图像/处理缓存并在图像视图上呈现。将 jar 放入工作区后,您只需要一行代码。

    而不是:

    holder.imgIcon.setImageBitmap(null);
    
    if(!localPhotosUrl.isEmpty()){
    
        File picToLoad = new File(localPhotosUrl.get(0));
        byte[] lala = null;
        try {
            lala = org.apache.commons.io.FileUtils.readFileToByteArray(picToLoad);
            s(lala.length);
            System.gc();
            Bitmap bitmap = BitmapFactory.decodeByteArray(lala, 0, lala.length);
    
            holder.imgIcon.setImageBitmap(bitmap);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
    
    }
    

    你可以替换成

    Picasso.with(context).load(localPhotosUrl).into(holder.imgIcon);
    

    【讨论】:

      【解决方案2】:

      您正在寻找的是图像的“延迟加载”。在 GetView 中加载图像会减慢它的速度。图片加载是在一个线程中完成的。

      见:Lazy load of images in ListView

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-18
        • 1970-01-01
        • 2020-03-10
        • 1970-01-01
        • 2020-12-21
        相关资源
        最近更新 更多