ByRecyclerView多布局,如何设置单双列item的margin

1.单一布局的效果图,2列android

这种边距很是简单:

a.在activity的主布局中,为ByRecyclerView设置一个layout_marginRight缓存

<me.jingbin.library.ByRecyclerView
     android:id="@+id/recycler_view"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:layout_marginRight="10dp"
      android:overScrollMode="never" />
复制代码

b.在ByRecyclerView适配器引入的布局中,设置layout_marginLeft和layout_marginTop,便可实现上面的卡片等边距的效果bash

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardBackgroundColor="@color/colorWhite"
    android:layout_marginLeft="10dp"
    android:layout_marginTop="10dp"
    app:cardCornerRadius="5dp"
    app:cardElevation="0dp">
复制代码

可是呢!!!!!若是是多布局,position=0的布局是单列,并且不要边距,要怎么办呢? 本篇的重点来咯~~~ 1.首先在activity的布局文件中,设置ByRecyclerViewapp

<me.jingbin.library.ByRecyclerView
      android:id="@+id/recycler_view"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:overScrollMode="never" />
复制代码

适配器中代码ide

//根据条件返回条目的类型
    @Override
    public int getItemViewType(int position) {
        if (position == 0) {
            return ITEM_TYPE_1;
        } else {
            return ITEM_TYPE_2;
        }
    }
    
        @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        RecyclerView.ViewHolder holder = null;
        //若是条目的类型等于1,加载轮播图,不然加载文章列表

        if (i == ITEM_TYPE_1) {
            View viewTop = LayoutInflater.from(activity).inflate(R.layout.home_tab,  viewGroup, false);
            if (holder == null) {
                holder = new BannnerViewHolder(viewTop);
            }
        } else if (i == ITEM_TYPE_2) {
            View view = LayoutInflater.from(activity).inflate(R.layout.item_layout_like1, viewGroup, false);
            /**
             * 用此方法margin无效果
             */
//            View view = LayoutInflater.from(activity).inflate(R.layout.item_layout_like1, null);
            if (holder == null) {
                holder = new ArticleViewHolder(view);
            }
        }
        return holder;
    }
复制代码

home_tab.xml,代码以下:布局

重点是:position=0的布局没有设置marginui

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="10dp"
    android:orientation="vertical">
    <RelativeLayout
        android:id="@+id/search"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="220dp"
        android:layout_marginTop="-1dp"
        android:layout_alignParentTop="true">
        .....
                </RelativeLayout>
        
</LinearLayout>

</layout>

复制代码

item_layout_like1.xml,代码以下:this

下面列表布局也没有设置marginspa

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardBackgroundColor="@color/colorWhite"
    app:cardCornerRadius="5dp"
    app:cardElevation="0dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        ....
            </LinearLayout>
</android.support.v7.widget.CardView>
复制代码

重点来咯~code

咱们在设配器绑定数据的时候,动态为两列布局设置margin

1.首先要计算好position,由于顶部position=0占了一个布局,因此下面列表的实际position应该要-1

2.判断左边项和右边项:经过跟2求余来判断(newPosition%2)

3.左边项设置:leftMargin,bottomMargin

4.右边项设置:leftMargin,bottomMargin,rightMargin

public class HomeAdapter3 extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private int margin;

    public HomeAdapter3(Activity context) {
        this.activity = context;
        margin = (int) activity.getResources().getDimension(R.dimen.dp_10);
    }
    
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
        if (viewHolder instanceof BannnerViewHolder) {
            onBindTopViewHolder((BannnerViewHolder) viewHolder, position);
        } else if (viewHolder instanceof ArticleViewHolder) {
            onBindMainViewHolder((ArticleViewHolder) viewHolder, position);
        }
    }
    
    private void onBindMainViewHolder(ArticleViewHolder articleViewHolder, int position) {
        /**
         * 1.解决recyclerview margin问题
         * 2.多布局,因此newPosition = i - 1;
         * 3.判断右边列:newPosition%2!=0  奇数
         */
        int newPosition = position;
        if (listData.size() > 0) {
            newPosition = position - 1;
        }

        GridLayoutManager.LayoutParams layoutParams
                = (GridLayoutManager.LayoutParams) articleViewHolder.itemView.getLayoutParams();
        if (newPosition % 2 != 0) {
            layoutParams.rightMargin = margin;
        } else {
            layoutParams.rightMargin = 0;
        }
        layoutParams.topMargin = 0;
        layoutParams.bottomMargin = margin;
        layoutParams.leftMargin = margin;
        articleViewHolder.itemView.setLayoutParams(layoutParams);//使设置好

        final ListData bean = listData.get(newPosition);
        articleViewHolder.tv_price_title.setText(FormatUtils.getMoneySign());
        articleViewHolder.tvPrice.setText(TextViewUtils.noEmpty(bean.getGoods_min_price()));
        articleViewHolder.tv_goods_sales.setText(bean.getGoods_sales() + "人付款");
        articleViewHolder.tv_title.setText(TextViewUtils.noEmpty(bean.getGoods_name()));

        LinearLayout.LayoutParams linearParams =(LinearLayout.LayoutParams) articleViewHolder.layout_img.getLayoutParams(); //取控件textView当前的布局参数
        linearParams.height = DensityUtil.getDisplayWidth()/2 - (int)activity.getResources().getDimension(R.dimen.dp_10)*3;// 控件的高强制设成
        articleViewHolder.layout_img.setLayoutParams(linearParams); //使设置好的布局参数应用到控件



        /**
         * 解决滑动recyclerview致使glide图片加载闪烁
         * 1.利用setTag
         * 2.Glide设置skipMemoryCache(true),跳过缓存
         */
        if (!bean.getImage().equals(articleViewHolder.iv.getTag(R.id.iv_hot))) {
            // 加载图片
            Glide.with(activity).load(bean.getImage()).skipMemoryCache(true)
//                    .apply(options)
                    .into(articleViewHolder.iv);
            articleViewHolder.iv.setTag(R.id.iv_hot, bean.getImage());
        }


        articleViewHolder.itemView.setOnClickListener(view -> {
            GoodDetailActivity.start(activity, bean.getId());
        });
    }
    }
复制代码

好了,就这样完美解决了!

相关文章
相关标签/搜索