Android Gallery - 使用TextView和ImageView不起作用?

时间:2011-11-27 10:19:49

标签: android textview imageview gallery

我有一个带有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;


    } 

}

1 个答案:

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

 }