簡體   English   中英

使用后台工作線程渲染ListView

[英]Rendering a ListView with a background worker thread

我在我的應用程序中有一個ListView,其中包含2個TextViews和2個ImageViews,我注意到當我滾動它時,它並不完全平滑,我四處搜索並注意到我需要一個需要渲染的后台工作線程我的ImageViews在我的listView中。 我嘗試實現它,但是因為我從我的線程內部引用了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; 
}

我建議您使用Picasso進行圖像加載/處理緩存以及在imageview上進行渲染。 將罐子放入工作區后,只需要一行代碼。

代替 :

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);

您正在尋找的圖像被稱為“延遲加載”。 將圖像加載到GetView中會使速度變慢。 圖像加載已在線程中完成。

請參閱: ListView中的圖像延遲加載

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM