Android - Gridview 行为异常
Android - Gridview behaves crazy
我有一个 CustomGrid
产品目录。网格的数据存储在本地。文本来自本地 JSON 文件,图像也存储在 res
下。
在显示 GridView 时,300 个项目没有正确排列。他们在 20 个条目后重复,当我上下滚动时他们混淆了。
我调试了数据数组,但它们看起来不错。我现在对每个项目也有相同的图像路径。所以每个 Gridview 项目都有相同的图像。但这与 GridView 的行为没有什么不同。
我在其他项目少得多的 Gridviews 上没有问题。我阅读了延迟加载,但我没有下载图像文件
为什么 Grid 会这样?这是不是一次过载太多了?我怎么解决这个问题?
编辑:
自定义网格:
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;
}
}
Activity:
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
}
});
试试这个代替你的 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;
}
}
我有一个 CustomGrid
产品目录。网格的数据存储在本地。文本来自本地 JSON 文件,图像也存储在 res
下。
在显示 GridView 时,300 个项目没有正确排列。他们在 20 个条目后重复,当我上下滚动时他们混淆了。
我调试了数据数组,但它们看起来不错。我现在对每个项目也有相同的图像路径。所以每个 Gridview 项目都有相同的图像。但这与 GridView 的行为没有什么不同。
我在其他项目少得多的 Gridviews 上没有问题。我阅读了延迟加载,但我没有下载图像文件
为什么 Grid 会这样?这是不是一次过载太多了?我怎么解决这个问题?
编辑:
自定义网格:
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;
}
}
Activity:
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
}
});
试试这个代替你的 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;
}
}