我有一个带有ImageViews的图库,我想在每个图片下面显示一个文本。我的代码不起作用,我不知道为什么。我在Android编程方面不是那么先进,所以编辑的代码响应将真正有用。当我从第一张图像快速滚动到最后一张图像时,我也会出现内存错误。
P.S:我尝试了很多类似于stackoverflow的主题,但没有一个对我有用。
public class ImageAdapter extends BaseAdapter {
int mGalleryItemBackground;
private Context mContext;
private Integer[] mImageIds = {
R.drawable.text,
R.drawable.numbers,
R.drawable.random,
R.drawable.programming,
R.drawable.left_hand,
R.drawable.right_hand,
R.drawable.maths,
R.drawable.capitals,
R.drawable.emoticons,
R.drawable.spaces,
R.drawable.fast,
R.drawable.ultimate,
};
private String[] scoreIndex={"1.56","2.56","2.56","2.56","2.56","2.56","2.56","2.56","2.56","2.56","2.56","2.56"};
private int j=0;
public ImageAdapter(Context c) {
mContext = c;
TypedArray a = obtainStyledAttributes(R.styleable.HelloGallery);
a.recycle();
}
public int getCount() {
return mImageIds.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View arg1, ViewGroup arg2) {
LinearLayout layout = new LinearLayout(getApplicationContext());
layout.setOrientation(LinearLayout.VERTICAL);
layout.setLayoutParams(new Gallery.LayoutParams(250, 200));
ImageView i = null;
// Riutilizziamo l'eventuale convertView.
if (arg1 == null) {
i = new ImageView(mContext);
} else {
i = (ImageView) arg1;
}
i.setImageResource(mImageIds[position]);
i.setLayoutParams(new Gallery.LayoutParams(250, 200));
i.setScaleType(ImageView.ScaleType.FIT_XY);
i.setBackgroundResource(mGalleryItemBackground);
TextView tv=new TextView(mContext);
tv.setTag(scoreIndex[position]);
tv.setText(scoreIndex[position]);
tv.setTextColor(0x000000);
tv.setTextSize(50);
tv.setPadding(0, 0, 0, 40);
tv.setGravity(Gravity.CENTER);
layout.addView(i);
layout.addView(tv);
return layout;
}
}
答案 0 :(得分:2)
要解决您的内存问题,请尝试重复使用您的一些视图,而不是每次都创建它们... getView()的第二个参数是一个可以转换的视图。您应该检查它是否为非null(它可以为null)并且它是正确的类型(仅当您的列表包含异构的视图类型集时才需要;从此代码示例中我不认为这适用于您)。然后,您可以清除该视图的内容,并在其中设置图像/文本,而不是膨胀新视图。当列表变大时,这应该节省大量的时间/内存。
解决布局问题:不是通过代码完全创建视图,而是在其自己的布局xml文件中为gallery项定义LinearLayout。然后,您可以使用视图充气器来充气。您应该能够使用可视化编辑器确保布局符合您的要求。
以下是我的意思(两条建议)的样本:
public View getView(final int position, final View convertView,
ViewGroup parent) {
LinearLayout viewToUse = (LinearLayout) convertView;
if (viewToUse == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
viewToUse.inflate(R.layout.yourlayoutname);
}
ImageView imgView = (ImageView)viewToUse.findViewById(R.id.imageviewid);
TextView txtView = (TextView)viewToUse.findViewById(R.id.textviewid);
txtView.setText(scoreIndes[position]);
imgView.setImageResource(mImageIds[position]);
}