Android GridView有两个不同的项目?

时间:2012-10-23 06:57:53

标签: android gridview memory-leaks

我有一个GridView,我应该填写两个不同的项目,如left_item和right_item。无论如何,我写了一个从BaseAdapter扩展的自定义适配器。

我看到转换后的观点并没有按照我的想法排序。所以我看到我的GridView是这样的:

Left    Right
Right   Left
Left    Right
Left    Right
Right   Left
…       …

等等。我也找到了一个解决方案。但我的问题是,我的解决方案是否是解决此问题的正确方法?这是我的自定义适配器和我的解决方案:

class MyGridAdapter extends BaseAdapter {

    // return even count in any case
    public int getCount() {
        if (items.size() % 2 == 0)
            return items.size();
        else
            return (items.size() + 1);
    }

    public Object getItem(int arg0) {
        return null;
    }

    public long getItemId(int arg0) {
        return 0;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;

        // Here, i thought that i was gonna have 
        // converted views one left one right, but i didn't!
        if (v == null) {
            if (position % 2 == 0) {
                // inflate left side
                v = inflater.inflate(R.layout.left_shelf_item, null);
            } else {
                // inflate right side
                v = inflater.inflate(R.layout.right_shelf_item, null);
            }
        }

        if (position % 2 == 0) {

          // So i had to inflate left view, if i'm not getting that
            if(v.getId() != R.layout.left_shelf_item)
                v = inflater.inflate(R.layout.left_shelf_item, null);

            if (position != items.size()) {
                ImageView img = (ImageView) v
                        .findViewById(R.id.leftShelfItemBook);
                if (img != null) {
                    int bookId = Integer.parseInt(items.get(position)
                            .getBookId());
                    if (images.get(bookId) != null) {
                        img.setImageDrawable(Drawable.createFromPath(images
                                .get(bookId)));
                    } else {
                        img.setImageDrawable(null);
                    }
                }
            }
        } else {

          // And here, i do the same for right
            if(v.getId() != R.layout.right_shelf_item)
                v = inflater.inflate(R.layout.right_shelf_item, null);

            if (position != items.size()) {
                ImageView img = (ImageView) v
                        .findViewById(R.id.rightShelfItemBook);
                if (img != null) {
                    int bookId = Integer.parseInt(items.get(position)
                            .getBookId());
                    if (images.get(bookId) != null) {
                        img.setImageDrawable(Drawable.createFromPath(images
                                .get(bookId)));
                    } else {
                        img.setImageDrawable(null);
                    }
                }
            } else if (position == items.size()) {
                ((View) v.findViewById(R.id.rightShelfItemHolder))
                        .setVisibility(View.GONE);
            }

        }

        return v;
    }

}

如你所见,我强迫适配器通过再次膨胀视图来使用正确的视图,如果它们不是它们应该是的那些。

因此,我非常担心内存泄漏并导致OutOfMemoryError,或者由于膨胀过多导致的其他一些错误。

还有其他方法可以达到这个目的吗?我需要一个更好的解决方案。 任何帮助或信息将不胜感激。

0 个答案:

没有答案