我在第一个 Activity 中使用 SurfaceView
。使用 SurfaceView
单击图像时,我转到第二个 Activity ,该 Activity 还存储最近单击图像的路径。在第二个 Activity 中,我想在 Gallery
中显示该图像。
在点击按钮的第二个 Activity 中,我再次转到第一个 Activity ,点击图片后,我转到第二个 Activity 。
现在在第二个 Activity 中,Gallery
中将显示 2 张图像。
我的问题是点击第一张图片后,Gallery
没有显示任何内容。请注意,正在调用为 Gallery
设置的适配器的 getView()
。
但是在点击第二张图片之后,当 Gallery
中有 2 张或更多图片时,它们会被显示。
我还尝试了 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 的建议,我尝试记录 length 值,第一次确实是 0,即调用 时i.setLayoutParams(new Gallery.LayoutParams(Math.round(length * 0.9f),LayoutParams.WRAP_CONTENT));
我通过这种方式在 onCreate()
之后设置这个 length
变量:
g.post(new Runnable() {
public void run() {
length = g.getRight() - g.getLeft();
}
});
因为我想在代码中检索父布局的宽度并相应地设置图库项目宽度。
我知道我得到 length
为 0 的原因是 setContentView()
需要一点时间才能生效。如何在调用 Adapter 之前检索?
最佳答案
变量length
似乎是这里的问题所在。如果它的值为 zero
,当调用第一个项目的 getView()
时,width
参数设置为 zero
.
在您的编辑中,length
确实获得了一个非零值,也许有点晚了。您可以进行以下调用来更新 View :
myAdapter.notifyDataSetChanged();
在计算length
之后,这个调用应该放在run()
中。
“闪烁”的解决方法很好。作为替代方案(如果画廊的宽度应与屏幕宽度匹配),请尝试以下操作:
代替:
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 = g.getWidth()
作为:
getWidth() = getRight() - getLeft()
关于android - 图库只有 1 张图片时不显示任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17745658/