2015-05-28 16 views
0

我是編程廣告的新手我在我的第一個應用程序,所以請原諒我的無知......還有我的英語。Android - GridView中的ViewHolder不能正常工作

我有一個GridView與圖像,我試圖實現一個ViewHolder來提高性能。

這是代碼。 XML爲ImageView的尺寸:

<ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="@dimen/grid_view_item_height" 
     android:id="@+id/immagineGriglia" /> 

和imageAdapter的Java代碼:

import android.app.Activity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.GridView; 
import android.widget.ImageView; 
import android.widget.TextView; 

import java.util.ArrayList; 

public class ImageAdapterAdulti15 extends ArrayAdapter { 
    private Context context; 
    private int layoutResourceId; 
    private ArrayList data = new ArrayList(); 

     // Keep all Images in array 
    public Integer[] mThumbIds = { 
      R.drawable.image1, R.drawabla.image2........ 
    }; 

    // Constructor 
    public ImageAdapterAdulti15(Context context, int layoutResourceId, ArrayList data) { 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 
    } 

    @Override 

    public View getView(int position, View convertView, ViewGroup parent) { 
     View cella = convertView; 
     ViewHolder holder = null; 

     if (cella == null) { 
      LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
      cella = inflater.inflate(layoutResourceId, parent, false); 
      holder = new ViewHolder(); 
      holder.immagineGriglia = (ImageView) cella.findViewById(R.id.immagineGriglia); 
      cella.setTag(holder); 
     } else { 
      holder = (ViewHolder) cella.getTag(); 
     } 

     ImageItem item = (ImageItem) data.get(position); 
     holder.immagineGriglia.setImageBitmap(item.getImage()); 
     return cella; 
    } 

    static class ViewHolder { 
     ImageView immagineGriglia;  
    }  
    } 

但有了這個代碼在GridView比以前更慢,沒有ViewHolder。

我認爲這個代碼不正確或不完整。 有人可以幫助解決它嗎? 謝謝...

+0

嘗試以異步方式加載bitamp請查看:http://www.coderzheaven.com/2013/09/01/faster-loading-images-gridviews-listviews-android-menory-caching-complete-實施樣本代碼/或http://developer.android.com/training/displaying-bitmaps/process-bitmap.html –

回答

0

因爲您使用的是位圖,所以Scrollview變得更慢。您應該使用圖像路徑作爲字符串,然後您可以使用任何圖像加載器庫(如通用圖像加載器或picasso)加載圖像。

0

你繪製陣列

Integer[] mThumbIds = {R.drawable.image_one, R.drawable.image_two, R.drawable.image_three}; 

你的ArrayAdapter

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

View cella = convertView; 
ViewHolder holder = null; 

    if (cella == null) { 
    LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
    cella = inflater.inflate(layoutResourceId, parent, false); 
    holder = new ViewHolder(); 
    holder.immagineGriglia = (ImageView) cella.findViewById(R.id.immagineGriglia); 
    cella.setTag(holder); 
    } else { 
    holder = (ViewHolder) cella.getTag(); 
    } 

ImageItem item = (ImageItem) data.get(position); 
holder.immagineGriglia.setImageDrawable(context.getResources().getDrawable(mThumbIds[position])); 
return cella; 
} 

getView完成

+0

謝謝, 工作但不好(我仍然在genymotion模擬器上測試)。在Android 4.2.2,API 17,768x1280的設備中,它可以工作,但會導致內存泄漏(在某些滾動和點擊應用程序崩潰後的圖像之後)。在Android 4.1.1-API 16-2560x1600,android 4.1.1-API 16-480x800和4.4.4-API 19-1080x1920的設備中,當我嘗試使用gridview打開活動時,應用程序崩潰。錯誤是OutOfMemoryError。 – Marcellino247

+0

你能否在標籤的清單文件中添加android:largeHeap =「true」? –

+0

惠特這樣更好。我仍然遇到高分辨率平板電腦的問題,但效果更好。 – Marcellino247

0

Recyclerview accelarted而不是ListView.This肯定會幫助你:)

public class HomeRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener { 


private List<String> mItemList; 

RecyclerView mRecyclerView; 

Context context; 
HomeItemViewHolder mHomeItemholder; 

public HomeRecyclerAdapter(List<String> itemList) { 
    mItemList = itemList; 
} 


public class HomeItemViewHolder extends RecyclerView.ViewHolder { 

    ImageView mImage; 


    public HomeItemViewHolder(View parent) { 
     super(parent); 

     mImage = (ImageView) parent.findViewById(R.id.Image); 

    } 

} 

public HomeRecyclerAdapter(List<String> itemList, Context context, RecyclerView mRecyclerView) { 
    this.mItemList = itemList; 
    this.context = context; 
    this.mRecyclerView = mRecyclerView; 


}