Java 以编程方式设置GridView和ImageView的宽度和高度

Java 以编程方式设置GridView和ImageView的宽度和高度,java,android,textview,imageview,android-gridview,Java,Android,Textview,Imageview,Android Gridview,我看到过很多关于如何分别设置ImageView和GridView的高度和宽度的问题,首先 但是,我想知道如何设置两者 这是我的设置。在我的GridView中,我有一个ImageView和一个TextView。我有一些不同宽度和大小的图像,我想调整大小始终是屏幕正方形大小的1/3。下面,我有一个文本描述 这是我到目前为止的代码 gallerygridview.xml <?xml version="1.0" encoding="utf-8"?> &

我看到过很多关于如何分别设置ImageView和GridView的高度和宽度的问题,首先

但是,我想知道如何设置两者

这是我的设置。在我的GridView中,我有一个ImageView和一个TextView。我有一些不同宽度和大小的图像,我想调整大小始终是屏幕正方形大小的1/3。下面,我有一个文本描述

这是我到目前为止的代码

gallerygridview.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/bg_light_blue"
    android:orientation="vertical" >

        <GridView
            android:id="@+id/gridGallery"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:numColumns="3"
            android:padding="0dp"
            android:verticalSpacing="4dp" >
        </GridView>

        <ImageView
            android:id="@+id/imgNoMedia"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:contentDescription="@string/app_name"
            />
        
        <TextView
           android:id="@+id/textView1"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textSize="12sp"
           android:textStyle="bold"
           android:typeface="sans"
           android:layout_below="@+id/imageView1"
           android:layout_marginTop="2dp"
           android:layout_centerHorizontal="true"
           android:textColorHighlight="#000000"
           android:gravity="center"
         />
</LinearLayout>
在我的适配器类中…

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.gallerygridview);
            
     GridView gridView = (GridView) findViewById(R.id.gridGallery);

     m_adapter = new PhotoImageAdapter(getBaseContext(),m_images);
     gridView.setAdapter(m_adapter); // uses the view to get the context instead of getActivity().
     registerForContextMenu(gridView);
     

 }
public View getView(int position, View convertView, ViewGroup parent) {
 
   View view = convertView;
   Holder holder=new Holder();

         if (view == null) {
             LayoutInflater inflater = LayoutInflater.from(mContext);
                view = inflater.inflate(R.layout.gallerygridview, parent, false);
              

            holder.img = new ImageView(mContext);
            holder.img = (ImageView) view.findViewById(R.id.imgNoMedia);
            holder.tv = (TextView) view.findViewById(R.id.textView1);
            
            
            int iDisplayWidth = mContext.getResources().getDisplayMetrics().widthPixels ;
            int iImageWidth = (iDisplayWidth / 3)-15 ; 
            GridView.LayoutParams glp = (GridView.LayoutParams) view.getLayoutParams();
            glp.width = iImageWidth;
            glp.height = iImageWidth ;
            view.setLayoutParams(glp);
       
            view.setTag(holder);
            
        } else {
            holder = (Holder) view.getTag();
        }

        holder.tv.setText(m_images.get(position).key);
        holder.img.setImageURI(Uri.parse(m_images.get(position).value));
        
    return view;
  }
目前,GridView正好是屏幕大小的1/3。以及图像和文本在两种显示器中的显示。但是我希望ImageView填充GridView单元格中的剩余空间

这是我想要的…

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.gallerygridview);
            
     GridView gridView = (GridView) findViewById(R.id.gridGallery);

     m_adapter = new PhotoImageAdapter(getBaseContext(),m_images);
     gridView.setAdapter(m_adapter); // uses the view to get the context instead of getActivity().
     registerForContextMenu(gridView);
     

 }
public View getView(int position, View convertView, ViewGroup parent) {
 
   View view = convertView;
   Holder holder=new Holder();

         if (view == null) {
             LayoutInflater inflater = LayoutInflater.from(mContext);
                view = inflater.inflate(R.layout.gallerygridview, parent, false);
              

            holder.img = new ImageView(mContext);
            holder.img = (ImageView) view.findViewById(R.id.imgNoMedia);
            holder.tv = (TextView) view.findViewById(R.id.textView1);
            
            
            int iDisplayWidth = mContext.getResources().getDisplayMetrics().widthPixels ;
            int iImageWidth = (iDisplayWidth / 3)-15 ; 
            GridView.LayoutParams glp = (GridView.LayoutParams) view.getLayoutParams();
            glp.width = iImageWidth;
            glp.height = iImageWidth ;
            view.setLayoutParams(glp);
       
            view.setTag(holder);
            
        } else {
            holder = (Holder) view.getTag();
        }

        holder.tv.setText(m_images.get(position).key);
        holder.img.setImageURI(Uri.parse(m_images.get(position).value));
        
    return view;
  }

但这就是它看起来的样子…

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.gallerygridview);
            
     GridView gridView = (GridView) findViewById(R.id.gridGallery);

     m_adapter = new PhotoImageAdapter(getBaseContext(),m_images);
     gridView.setAdapter(m_adapter); // uses the view to get the context instead of getActivity().
     registerForContextMenu(gridView);
     

 }
public View getView(int position, View convertView, ViewGroup parent) {
 
   View view = convertView;
   Holder holder=new Holder();

         if (view == null) {
             LayoutInflater inflater = LayoutInflater.from(mContext);
                view = inflater.inflate(R.layout.gallerygridview, parent, false);
              

            holder.img = new ImageView(mContext);
            holder.img = (ImageView) view.findViewById(R.id.imgNoMedia);
            holder.tv = (TextView) view.findViewById(R.id.textView1);
            
            
            int iDisplayWidth = mContext.getResources().getDisplayMetrics().widthPixels ;
            int iImageWidth = (iDisplayWidth / 3)-15 ; 
            GridView.LayoutParams glp = (GridView.LayoutParams) view.getLayoutParams();
            glp.width = iImageWidth;
            glp.height = iImageWidth ;
            view.setLayoutParams(glp);
       
            view.setTag(holder);
            
        } else {
            holder = (Holder) view.getTag();
        }

        holder.tv.setText(m_images.get(position).key);
        holder.img.setImageURI(Uri.parse(m_images.get(position).value));
        
    return view;
  }

我做错了什么?还有,如何以编程方式设置GridView的高度及其内部的ImageView?


提前感谢。

这里有一个相对简单的方法。在布局中加入GridView,将拉伸模式设置为拉伸列宽,将间距设置为0(或任意值),并将列数设置为2:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <GridView
        android:id="@+id/gridview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:verticalSpacing="0dp"
        android:horizontalSpacing="0dp"
        android:stretchMode="columnWidth"
        android:numColumns="2" 
        />
</FrameLayout>


请参阅了解有关GridView和ImageView的更多信息查看输出图像后,以下是我的理解以及出现此问题的原因

  • 缩放图像时,必须根据该图像的纵横比进行缩放。 例如:假设您的图像尺寸为
    900 1200(宽高)
    要将其宽度缩放到
    400
    ,需要这样做

    newWidth=400;
    新高度=1200*(400/900)=533.33

  • 如果希望imageview的图像自动缩放,请检查xml布局中imageview的缩放类型属性(
    fitCenter、centerInside
    等)

  • 在getView中添加此行

    holder.img.setScaleType(ScaleType.CENTER_内)


  • +1用于链接。这正是我想要的。谢谢