我的问题很简单:当我点击显示GridView(一切都很好),然后我按回来再次点击GridView。然后在GridView中有双倍的图像。例如,如果第一次在GridView中有5张照片,第二次有10张照片。我认为问题出在我的ImageAdapter中:
public class ImageAdapter extends BaseAdapter {
private List<Item> items = new ArrayList<Item>();
private LayoutInflater inflater;
public ImageAdapter(Context context, List<Item> items) {
inflater = LayoutInflater.from(context);
this.items = items;
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int i) {
return items.get(i);
}
@Override
public long getItemId(int i) {
return items.get(i).drawable;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
View v;
ImageView picture;
TextView name;
if (view == null) {
v = inflater.inflate(R.layout.squareimageview, null, false);
v.setTag(R.id.picture, v.findViewById(R.id.picture));
v.setTag(R.id.text, v.findViewById(R.id.text));
picture = (ImageView) v.getTag(R.id.picture);
name = (TextView) v.getTag(R.id.text);
Item item = (Item) items.get(i);
picture.setImageResource(item.getDrawable());
name.setText(item.name);
} else {
v = view;
System.out.println("Cia");
}
return v;
}
}
GridView的:
public static List<Item> items = new ArrayList<Item>();
...
items.add(new Item("Name1", "Text1", R.drawable.pic_12));
items.add(new Item("Name2", "Text2", R.drawable.pic_13));
items.add(new Item("Name3", "Text3", R.drawable.pic_14));
items.add(new Item("Name4", "Text4", R.drawable.pic_15));
items.add(new Item("Name5", "Text5", R.drawable.pic_2));
GridView gridView = (GridView) findViewById(R.id.gridview);
gridView.setAdapter(new ImageAdapter(this, items));
项目类:
public class Item {
String name;
int drawable;
String text;
public int getDrawable() {
return drawable;
}
public void setDrawable(int drawable) {
this.drawable = drawable;
}
public Item(String name, String text, int id) {
this.name = name;
this.text = text;
this.drawable = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
答案 0 :(得分:0)
当你回去时,你很可能没有完成活动,所以gridview永远不会被杀死并再次获得同一批图像(在相信的onresume()回调中?)。
如果是这种情况,请确保完成()覆盖onBackPressed()的活动或每次onResume()调用重新创建ListView:
ListView lv = new ListView(this);
然后添加数据。
然而,要确定问题,我们需要更多代码。
<强>&LT;&LT;&LT;&LT;&LT;编辑:&gt;&gt;&gt;&gt;&gt;
好的,这就是问题所在:
public static List<Item> items = new ArrayList<Item>();
只需删除静态修饰符:
public List<Item> items = new ArrayList<Item>();
使用静态修饰符可使该列表在您的活动之间保持不变。这意味着你不断添加项目,而永远不会重新创建/清除它。
否则,您每次要添加项目批次时都可以清除列表:
items.clear();
items.add(new Item("Name1", "Text1", R.drawable.pic_12));
items.add(new Item("Name2", "Text2", R.drawable.pic_13));
items.add(new Item("Name3", "Text3", R.drawable.pic_14));
items.add(new Item("Name4", "Text4", R.drawable.pic_15));
items.add(new Item("Name5", "Text5", R.drawable.pic_2));
GridView gridView = (GridView) findViewById(R.id.gridview);
gridView.setAdapter(new ImageAdapter(this, items));
答案 1 :(得分:0)
首先,您将获得双重图像,因为您没有清除用作数据持有者的ArrayList
。
你有一些解决方案:
在添加项目之前清除ArrayList
items.clear()
items.add(new Item("Name1", "Text1", R.drawable.pic_12));
items.add(new Item("Name2", "Text2", R.drawable.pic_13));
items.add(new Item("Name3", "Text3", R.drawable.pic_14));
items.add(new Item("Name4", "Text4", R.drawable.pic_15));
items.add(new Item("Name5", "Text5", R.drawable.pic_2));
ImageAdapter imaadpter=new ImangeAdapter(this,items);
gridView.setAdapter(imaadpter);
在添加之前检查数组中是否有项目
if( items.isEmpty() ) {
items.add(new Item("Name1", "Text1", R.drawable.pic_12));
items.add(new Item("Name2", "Text2", R.drawable.pic_13));
items.add(new Item("Name3", "Text3", R.drawable.pic_14));
items.add(new Item("Name4", "Text4", R.drawable.pic_15));
items.add(new Item("Name5", "Text5", R.drawable.pic_2));
}
ImageAdapter imaadpter=new ImangeAdapter(this,items);
gridView.setAdapter(imaadpter);
当你回去时,你打电话给items.clear()
,那么你肯定不会得到双重物品。
NB:您的代码中还有另一个相当大的错误,您没有注意到它导致您没有需要滚动或重复使用网格视图项的项目。
在你的getView方法中,你必须在if-else状态之外设置值,这样当你重用一个View时你会更新它的内容 @Override
public View getView(int i, View view, ViewGroup viewGroup) {
View v;
ImageView picture;
TextView name;
if (view == null) {
v = inflater.inflate(R.layout.squareimageview, null, false);
v.setTag(R.id.picture, v.findViewById(R.id.picture));
v.setTag(R.id.text, v.findViewById(R.id.text));
picture = (ImageView) v.getTag(R.id.picture);
name = (TextView) v.getTag(R.id.text);
} else {
v = view;
System.out.println("Cia");
}
Item item = (Item) items.get(i);
picture.setImageResource(item.getDrawable());
name.setText(item.name);
return v;
}