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());
});
}
}
复制代码
好了,就这样完美解决了!