2012-07-23 104 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