【问题标题】:Recyclerview gridlayout manager showing unnecessary spaceRecyclerview 网格布局管理器显示不必要的空间
【发布时间】:2020-12-31 21:50:24
【问题描述】:

我正在尝试在 gridview 布局管理器的 recyclerview 中显示自定义布局,但是在第二行之后,额外的空间进入了边框。 因此我的问题是如何删除多余的空间以及空间背后的原因是什么?

附加图片和代码sn-ps。

自定义项目视图布局

<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/frameLayout"   
android:layout_margin="2dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/img_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="1dp"
        android:layout_marginRight="1dp"
        android:layout_marginTop="1dp"
        android:src="@drawable/redcap"
        android:scaleType="fitCenter"/>

    <TextView
        android:id="@+id/tv_info"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/img_content"
        android:layout_centerHorizontal="true"
        android:background="@color/white"
        android:layout_margin="1dp"
        android:layout_gravity="center|bottom|left"
        android:gravity="left"
        android:padding="8dp"
        android:textColor="@color/primary_dark"
        android:textSize="@dimen/TvTextSizeNormal"/>

</RelativeLayout>

适配器代码

 public class MyAdapter extends BaseAdapter {
   
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
   
    View view = null;
    final Item item = mItems.get(position);
    
    if (convertView == null) {
     
     Holder holder = new Holder();
     view = View.inflate(mContext, R.layout.myItemView, null);
     holder.img_content =  view.findViewById(R.id.img_content);
     holder.tv_info = (TextView) view.findViewById(R.id.tv_info);
     view.setTag(holder);
        
    } else {
        view = convertView;
    }

     Holder holder = (Holder) view.getTag();
     holder.tv_info.setText(item.getCategoryName());
     Picasso.get().load(url).fit().into(holder.img_content);
     return view;
    
   }

 }

MainActivity

    myAdapter= new MyAdapter(MainActivity.this,subCategoryList);
    recyclerGridView.setLayoutManager(new GridLayoutManager(this,2));
    recyclerGridView.setAdapter(myAdapter); 

【问题讨论】:

  • 请问为什么要扩展 BaseAdapter 而不是 RecyclerView.Adapter?
  • 定义图像的高度,这将解决问题。 IE。 android:layout_height="200dp"
  • @ChandanPednekar 嗨,是的,原始代码中很少有功能很容易在 BaseAdapter 中实现,因此采用 BaseAdapter。
  • @NehaK 。我不能给出静态高度。
  • 因为这一行:android:scaleType="fitCenter"

标签: android gridview android-recyclerview android-gridview gridlayoutmanager


【解决方案1】:

我的一个项目中的布局完全相同

android:adjustViewBounds="true"
android:scaleType="centerCrop"

并从 Picasso 通话中删除 .fit()

【讨论】:

    【解决方案2】:

    使用下面的类,这将根据实际图像调整 ImageView 的高度:

    import android.content.Context;
    import android.graphics.drawable.Drawable;
    import android.util.AttributeSet;
    import android.util.Log;
    
    public class ManageHeightByWidthImageView extends androidx.appcompat.widget.AppCompatImageView {
    
        public int width = -1;
        public int height = -1;
    
        public ManageHeightByWidthImageView(Context context) {
            super(context);
        }
    
        public ManageHeightByWidthImageView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public ManageHeightByWidthImageView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    
            Drawable d = getDrawable();
            if (d != null) {
    
                int imageIntrinsicWidth = d.getIntrinsicWidth();
                int imageIntrinsicHeight = d.getIntrinsicHeight();
    
                Log.d(ManageHeightByWidthImageView.class.getName(), imageIntrinsicWidth + " -- " + imageIntrinsicHeight);
    
                int w = MeasureSpec.getSize(widthMeasureSpec);
                int h = w * d.getIntrinsicHeight() / d.getIntrinsicWidth();
    
                width = w;
                height = h;
                try {
                    setMeasuredDimension(w, h);
                } catch (NullPointerException ignored) {
                }
            } else {
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            }
        }
    
    }
    

    如何在你的代码中使用:

    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/frameLayout"
        android:layout_margin="2dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <com.proportionlImageView.ManageHeightByWidthImageView
            android:id="@+id/img_content"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="1dp"
            android:layout_marginRight="1dp"
            android:layout_marginTop="1dp"
            android:minHeight="100dp"
            android:src="@drawable/redcap"
            android:scaleType="fitCenter"/>
    
        <TextView
            android:id="@+id/tv_info"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/img_content"
            android:layout_centerHorizontal="true"
            android:background="@color/white"
            android:layout_margin="1dp"
            android:layout_gravity="center|bottom|left"
            android:gravity="left"
            android:padding="8dp"
            android:textColor="@color/primary_dark"
            android:textSize="@dimen/TvTextSizeNormal"/>
    
    </RelativeLayout>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      相关资源
      最近更新 更多