Галерея Android - Использование TextView и ImageView не работает? - PullRequest
0 голосов
/ 27 ноября 2011

У меня есть Галерея с 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 Ответ

2 голосов
/ 27 ноября 2011

Чтобы решить проблему с памятью, попробуйте повторно использовать некоторые из ваших представлений, а не создавать их каждый раз ... 2-й аргумент getView () - это представление, которое можно преобразовать. Вы должны проверить, что он не нулевой (может быть нулевым) и что это правильный тип (необходим только в том случае, если ваш список содержит разнородный набор типов представлений; из этого примера кода я не думаю, что это относится к вам). Затем вы можете очистить текущее содержимое этого вида и установить изображение / текст в них, а не надувать новый вид. Это должно сэкономить значительное количество времени / памяти, поскольку ваш список становится большим.

Для решения проблем макета: вместо полного создания представления с помощью кода определите LinearLayout для элемента галереи в его собственном XML-файле макета. Затем вы можете использовать инфлятор вида, чтобы надуть это. Вы должны быть в состоянии использовать визуальный редактор, чтобы убедиться, что макет такой, какой вы хотите.

Вот пример того, что я имею в виду (с обоими предложениями):

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

 }
...