2017-02-14 30 views
-1

我对产品目录有CustomGrid。网格的数据存储在本地。文本来自本地JSON文件,图像也存储在res下。Android - Gridview表现疯狂

显示GridView时,300个项目未正确排列。他们在20次参赛后重复,当我上下滚动时他们混在一起。

我调试了数据数组,但它们看起来很好。我现在也对每个项目都有相同的图像路径。所以每个Gridview项目都有相同的图像。但那是没有不同的GridView行为。

我对其他Gridviews没有问题,只有更少的项目。我读了关于延迟加载,但我没有下载图像文件

为什么网格的行为如此?这是否太多过载?我怎么解决这个问题?

编辑:

CustomGrid:

public class CustomGrid extends BaseAdapter{ 
private Context mContext; 
private final String[] gridItemText; 
private final int[] imageID; 

public CustomGrid(Context c, String[] gridItemText, int[] imageID){ 
    mContext = c; 
    this.gridItemText = gridItemText; 
    this.imageID = imageID; 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return gridItemText.length; 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    View grid; 
    LayoutInflater inflater = (LayoutInflater) mContext 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    if (convertView == null) { 

     //grid = new View(mContext); 
     grid = inflater.inflate(R.layout.grid_single_main, null); 
     TextView textView = (TextView) grid.findViewById(R.id.grid_single_text); 
     ImageView imageView = (ImageView)grid.findViewById(R.id.grid_single_image); 
     textView.setText(gridItemText[position]); 
     imageView.setImageResource(imageID[position]); 
    } else { 
     grid = (View) convertView; 
    } 

    return grid; 
} 

} 

活动:

CustomGrid adapter = new CustomGrid(ProductCatalogActivity.this, menuData, imagePath); 
    gridView1=(GridView)findViewById(R.id.grid_Main); 
    gridView1.setAdapter(adapter); 
    gridView1.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 
      //ToDo 
    } 
}); 
+3

请问您可以添加一些代码 – raktale

+0

我加了相关代码 – Mike

回答

1

到位您Viewholder机制试试这个

TextView textView; 
    ImageView imageView; 

    if (convertView == null) { 

     //grid = new View(mContext); 
     convertView = inflater.inflate(R.layout.grid_single_main, null); 
     textView = (TextView) convertView.findViewById(R.id.grid_single_text); 
     imageView = (ImageView) convertView.findViewById(R.id.grid_single_image); 
     convertView.setTag(new ViewHolder(textView, imageView)); 
    } else { 

     ViewHolder viewHolder = (ViewHolder) convertView.getTag(); 
     textView = viewHolder.textView; 
     imageView = viewHolder.imageView; 

    } 

    textView.setText(gridItemText[position]); 
    imageView.setImageResource(imageID[position]); 
return convertView; 

也用这个viewholder

private static class ViewHolder { 

     public final TextView textView; 
     public final ImageView imageView; 

     public ViewHolder(TextView textView, ImageView imageView) { 
      this.textView = textView; 
      this.imageView = imageView; 
     } 
    } 
+0

谢谢。这工作。但为什么? – Mike

+0

那么我的猜测是,你使用的视图持有人没有正确处理对象,例如没有对象引用保留机制,如setTag()或等价物,因此对象的状态可能会因此而改变。 – raktale