1

SurfaceView在我的第一个活动中使用。使用 单击图像SurfaceView时,我会转到第二个活动,该活动还存储最近单击的图像的路径。在第二个活动中,我想在Gallery.

在单击按钮的第二个活动中,我再次移至第一个活动,单击图片后,我移至第二个活动。

现在在第二个活动中,将有 2 个图像应该显示在Gallery.

我的问题是单击第一张图片后,Gallery没有显示任何内容。请注意,getView()设置为的适配器Gallery被调用。

但是在点击第 2 张图片之后,当 中有 2 张或更多图片时Gallery,它们会被显示出来。

我也试过g.refreshDrawableState();之后

g.setAdapter(new ImageAdapter(this));
g.setOnItemClickListener(this);     
g.setSelection(0, false);

但无济于事。

我知道我在这里写的东西听起来很复杂,但试着想象一下这个场景。

任何帮助表示赞赏。

编辑

ImageAdapter.java

public class ImageAdapter extends BaseAdapter {
        public ImageAdapter(Context c) {
            mContext = c;
        }

        public int getCount() {
            return mImageIds.length;//mImageIds is Array of image paths
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView i = new ImageView(mContext);

            final String imageUri = mImageIds[position].trim();
            try {
                if (imageUri.length() != 0) {
                    File f = new File(imageUri);
                    if (f.exists()) {
                        b = constants.shrinkBitmap(f.getPath(), 800, 800);
                        d = new BitmapDrawable(getResources(), b);
                        i.setImageDrawable(d);
                    } else {
                        i.setBackgroundColor(Color.WHITE);
                        i.setImageResource(R.drawable.ic_launcher);
                    }
                } else {
                    i.setBackgroundResource(R.drawable.ic_launcher);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            i.setAdjustViewBounds(true);
//BELOW "length" is some predefined value
            i.setPadding(Math.round(length * 0.05f), 0,
                    Math.round(length * 0.05f), 0);
            i.setLayoutParams(new Gallery.LayoutParams(Math
                    .round(length * 0.9f),
                    LayoutParams.WRAP_CONTENT));
            i.setScaleType(ScaleType.FIT_XY);
            return i;
        }
    }

编辑 (2)

Vikram的建议之后,我尝试记录长度值,第一次确实为0,即调用时i.setLayoutParams(new Gallery.LayoutParams(Math.round(length * 0.9f),LayoutParams.WRAP_CONTENT));

我通过这种方式设置了这个length变量onCreate()

g.post(new Runnable() {
     public void run() {
       length = g.getRight() - g.getLeft();
     }
    });

因为我想在代码中检索父布局的宽度并相应地设置图库项目宽度。

我知道我得到length0 的原因是setContentView()需要一些时间才能生效。在调用适配器之前如何检索?

4

1 回答 1

1

变量length似乎是这里的问题。如果它的值为zero,当getView()第一项被调用时,width参数设置为zero

在您的编辑中,length确实得到了一个非零值,可能有点晚了。您可以进行以下调用来更新视图:

myAdapter.notifyDataSetChanged();

这个调用应该run()在计算之后放在里面length

您的“闪烁”解决方法很好。作为替代方案(如果画廊的宽度应与屏幕宽度匹配),请尝试以下操作:

代替:

g.post(new Runnable() {
 public void run() {
   length = g.getRight() - g.getLeft();
 }
});

放:

Point pointSize = new Point();
getWindowManager().getDefaultDisplay().getSize(pointSize);
length = pointSize.x;

在初始化适配器之前放置它。

这里要注意的另一件事g.getRight()是计算为:

g.getRight() = g.getLeft() + g.getWidth()

因此,要计算length,您不妨这样做:

length = g.getWidth()

作为:

getWidth() = getRight() - getLeft()
于 2013-07-19T15:25:05.827 回答