2012-07-23 99 views
2

當我嘗試每次使用回收的gridview時,如果convertView!= null,我得到一個錯誤,那麼我在這裏得到一個錯誤是我的源代碼。 它會給我一個錯誤,在text =(TextView)convertView;在其他語句中。我真的失去了這裏,我只想停止回收的意見,但隨後其沉重的記憶和波濤洶涌的滾動Android網格視圖回收問題

$這裏是imageadapter.java

public View getView(int position, View convertView, ViewGroup parent) { 
    RelativeLayout lay; 

    ImageView image; 
    TextView text; 
    if (convertView == null) { 
     Log.d("height", "Width = " + width); 

     lay = new RelativeLayout(mContext); 
     image = new ImageView(mContext); 
     text = new TextView(mContext); 


     //text.setText("This is a test"); 
     text.setTextSize(14); 
     text.setTextColor(Color.WHITE); 
     text.setGravity(Gravity.LEFT | Gravity.TOP); 
     text.setPadding(2, 2, 2, 2); 
     text.setBackgroundColor(Color.parseColor("#80000000")); 
     RelativeLayout.LayoutParams textLayout = new RelativeLayout.LayoutParams(
       (int) Math.round(width/2.0), 
       (int) Math.round(width/8.3)); 

     textLayout.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
     text.setLayoutParams(textLayout); 

     MarginLayoutParams textMarginFix = (ViewGroup.MarginLayoutParams) text 
       .getLayoutParams(); 
     textMarginFix.setMargins(0, 0, 0, (int) Math.round(width/45.0)); 
     text.setLayoutParams(textMarginFix); 

     image.setLayoutParams(new LayoutParams((int) Math 
       .round(width/2.0), (int) Math.round(width/   2.0))); 

     image.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     //image.setImageResource(mThumbIds[position]); 

     lay.setLayoutParams(new GridView.LayoutParams((int) Math 
       .round(width/2.0), (int) Math.round(width/2.0))); 
     lay.setBackgroundResource(R.drawable.shadowimage); 
     lay.setPadding(5, 5, 15, 15); 
     //lay.setId(mThumbIds[position]); 

     //lay.addView(image); 
     //lay.addView(text); 

    } 
    else 
    { 
     text = (TextView) convertView; 
     image = (ImageView) convertView; 
     lay = (RelativeLayout) convertView; 
    } 

    image.setImageResource(mThumbIds[position]); 
    text.setText("This is a test"); 

    lay.addView(image); 
    lay.addView(text); 

    return lay; 

} 
$here is where i call the imageadapter from another class 

    @Override 
public Object instantiateItem(View container, int position) { 
    View contentView;   
    switch (position) { 
    case 0: 
     LayoutInflater mInflater = LayoutInflater.from(mContext); 
     View contentView = mInflater.inflate(R.layout.image_grid_view, null); 
     Display display = mContext.getWindowManager().getDefaultDisplay(); 
     final int width = display.getWidth(); 
     int height = display.getHeight(); 
     float scale = mContext.getResources().getDisplayMetrics().density; 
     GridView gridview = (GridView) contentView.findViewById(R.id.gridview); 
     gridview.setAdapter(new ImageAdapter(mContext, width, height, scale)); 
     gridview.setFocusable(true); 
     gridview.requestFocus(); 
     gridview.setOnItemClickListener(itemClickListener); 

     ((ViewPager) container).addView(contentView, 0); 
     break; 
...return contentView 
+0

但我不是,這些圖像存儲在我看到的應用程序 – MobDev 2012-07-23 01:32:44

+0

。我會建議按照答案重做代碼。 – sandrstar 2012-07-23 01:38:07

回答

2

convertView是完全代表你的GridView一個項目的看法。如果這是一個TextView,它將是一個TextView,如果它是整個佈局,您將收到整個佈局等。

那麼如何知道和定義什麼是「代表一個項目的視圖」?簡單而言,無論您是在convertView == null然後returngetView創建。

只是你收到一個使用過的物品,你只是修改它來更新它到適當的內容。所以你應該利用類型轉換來獲得你以你想要的格式獲得的這個View

下面的代碼一樣會得到你想要的東西,而不用重新事情你不需要做(又名你不需要從convertView重新添加子Views,只是一個新的視圖):

public View getView(int position, View convertView, ViewGroup parent) { 
    RelativeLayout lay; 
    ImageView image; 
    TextView text; 

    if (convertView == null) { 
     // Setup your 'item view' 
     lay = new RelativeLayout(mContext); 
     image = new ImageView(mContext); 
     text = new TextView(mContext); 

     // Do all your customizing stuff (aka size, color, format, padding layout params) 

     lay.addView(image, 0); 
     lay.addView(text, 1); 
    } else { 
     lay = (RelativeLayout) convertView; 
     image = (ImageView) lay.getChildAt(0); 
     text = (TextView) lay.getChildAt(1); 
    } 

    // Set content for your image and text 

    return lay; 
} 
+0

好了,現在我明白這裏發生了什麼,非常感謝。代碼運行良好。對我來說不幸的是,gridview上的滾動條仍然被切碎,不光滑。這肯定是其他原因,可能是由於圖像縮小了,導致加載速度緩慢 – MobDev 2012-07-23 02:11:50

+0

也就是說,你正在進入很多GridViews的大問題,我已經與之爭鬥了一段時間。一次在屏幕上顯示多少項目?你的圖片尺寸是多少?有很多工作將它從現在的東西轉移到順利滾動的東西上。[Here](http://developer.android.com/training/displaying-bitmaps/index.html)是一個很好的開始。從那裏你將不得不做出一些你真正需要的設計選擇(即將所有圖像直接加載到緩存中並將其調整大小,或者花費太長的時間等等)。 – 2012-07-23 02:19:02

+0

是的,我加載了大約20張圖片,每個圖片的寬度和高度都在500px左右。我嘗試加載較小的圖像,並且完美運行。所以我必須找到另一種縮放這些圖像的方法。 gridview不是我的朋友 – MobDev 2012-07-23 02:27:30

0

[ADDITION]

此外,你的代碼

image.setImageResource(mThumbIds[position]); 
text.setText("This is a test"); 

lay.addView(image); 
lay.addView(text); 

return lay; 

的,如果和其他外,這是什麼意思是,你正試圖添加一個子視圖EVERY TIME一個單元格的視圖被要求。你真的只需要添加意見來處理日常工作的一部分。

[ORIGINAL] 最有可能的convertView是你的父母,並且所有其他視圖都是它的子。在你的其他條款中,你所做的只是將每一條都設置爲相同的東西。 convertView如何一次完成三個完全不同的事情。

最有可能它需要:

text = (TextView) convertView.SomeTextViewSubToConvertView; 
image = (ImageView) convertView.SomeImageViewSubToConvertView; 
lay = (RelativeLayout) convertView.SomeRelativeLayoutSubToConvertView; 
+0

感謝您的迴應我會嘗試這 – MobDev 2012-07-23 01:43:57

+0

@ user1486574 - 我已添加到我的答案! – trumpetlicks 2012-07-23 01:51:05

+0

再次感謝,我仍然遇到麻煩,我嘗試將ID分配給單個視圖,但它仍然在同一個位置出現問題。我試圖從谷歌http://developer.android.com/guide/topics/ui/layout/gridview.html – MobDev 2012-07-23 01:57:42