Ошибка настройки параметров макета на ImageView

#android #android-layout #android-linearlayout #android-imageview

#Android #android-layout #android-linearlayout #android-imageview

Вопрос:

У меня возникают проблемы при попытке установить 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
  

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

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


ОТРЕДАКТИРОВАНО

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. вы хотите изменить размер изображения с помощью LayoutParams

2. Пожалуйста, покажите код, в который вы добавляете imageview.

3. @surendra Да, если я не буду использовать фиксированный размер, изображения будут действительно большими для «галереи».

Ответ №1:

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

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

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

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