Ошибка установки параметров макета для ImageView - PullRequest
1 голос
/ 30 сентября 2011

У меня возникают проблемы при попытке установить layoutparams на ImageView, созданный программно:

imageView.setLayoutParams(new LinearLayout.LayoutParams(gallerySize.x, gallerySize.y));

ImageView находится внутри LinearLayout, и я думаю, что это должно работать, но я получаюэта ошибка:

09-30 10:33:24.450: ERROR/AndroidRuntime(5418): java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams

Возможно, тот факт, что это действие imageView настроено на использование другого макета для портретного и альбомного представлений (я использую это с другой копией XML-макета внутри layout-landпапка).Когда он находится в книжной ориентации, проблемная строка кода не выполняется, вместо этого я выполняю следующую строку:

imageView.setLayoutParams(new Gallery.LayoutParams(gallerySize.x, gallerySize.y));

Я пытался оставить эту строку без изменений, но затем я получаю ошибку:

09-30 10:49:47.450: ERROR/AndroidRuntime(5760): java.lang.ClassCastException: android.widget.Gallery$LayoutParams

Основное различие в книжной и альбомной ориентации заключается в том, что для портрета используется LinearLayout с вертикальной ориентацией и имеется виджет Gallery (который использует этот imageView), в то время как проблемный пейзаж использует горизонтальную ориентацию и ListViewвместо Gallery.

Я немного растерялся, любые советы будут оценены.


EDITED

ImageView реализован в этом классе:

    public class ImageAdapter extends BaseAdapter {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView imageView = new ImageView(mContext);

            Bitmap temp = BitmapFactory.decodeFile(appFolder+"/"+imagesPath[position]);
            //productImages[position] = temp;

            imageView.setImageBitmap(temp);

            if(landscape)
                imageView.setLayoutParams(new LinearLayout.LayoutParams(gallerySize.x, gallerySize.y));
            else
                imageView.setLayoutParams(new Gallery.LayoutParams(gallerySize.x, gallerySize.y));


            imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
            imageView.setBackgroundResource(mGalleryItemBackground);

            return imageView;
        }
    }

И здесь используется экземпляр ImageAdapter:

    public onCreate(...) {
        ...
        if(!landscape) {
        Gallery gallery = (Gallery) findViewById(R.infoproduto.gallery);
        gallery.setAdapter(new ImageAdapter(this));
        gallery.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView parent, View v, int position, long id) {
                    setSelectedImage(position);
                }
            }); 
        }
        else {
        ListView galleryLView = (ListView) findViewById(R.infoproduto.galleryLView);
        galleryLView.setAdapter(new ImageAdapter(this));
        galleryLView.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView parent, View v, int position, long id) {
                    setSelectedImage(position);
                }
            });
        }
    }

1 Ответ

1 голос
/ 03 октября 2011

Ну, я разобрался с решением, это было так очевидно!

ImageView используется внутри ImageAdapter, и этот ImageAdapter устанавливается в качестве адаптера в экземпляре ListView:

    ListView galleryLView = (ListView) findViewById(R.infoproduto.galleryLView);
    galleryLView.setAdapter(new ImageAdapter(this));

Поэтому вместо использования LinearLayout.LayoutParams (это единственный макет в моем XML-файле) я использовал ListView.LayoutParams, и он отлично работает!

...