GridView的Android ImageAdapter显示相同(加倍)的图像

时间:2013-12-01 10:04:40

标签: android image gridview

我的问题很简单:当我点击显示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;
    }

}

2 个答案:

答案 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;

}