在回收者视图中显示广告
Showing Ads in Recycler View
我正在使用 Recycler View,其中我必须在 GridLayout Manager 中显示两个项目并且跨度数为 2。
GridLayoutManager gridLayoutManager;
gridLayoutManager = new GridLayoutManager(getActivity(), 2);
newsRecycler.setLayoutManager(gridLayoutManager);
主要问题是我必须在四个项目(即 2 行)之后显示广告
由于跨度计数,将覆盖 mobile.But 的宽度广告也将出现在网格 layout.Any 帮助中将不胜感激!!
输出是这样的:-
预期输出:--
适配器Class:-
public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> {
private List<HomeNewsDataModel> homeNewsDataModels;
public NewsAdapter(FragmentActivity activity, List<HomeNewsDataModel> homeNewsDataModels) {
this.activity = activity;
this.homeNewsDataModels=homeNewsDataModels;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View v = null;
v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.news_item_layout, viewGroup, false);
return new ContentViewHolder(v);
}
}
private final int CONTENT_TYPE=1;
private final int AD_TYPE=2;
@Override
public int getItemViewType(int position)
{
if (position % 4 == 0)
return AD_TYPE;
return CONTENT_TYPE;
}
class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View itemView) {
super(itemView);
}
}
class ContentViewHolder extends ViewHolder {
@BindView(R.id.news_item)
LinearLayout newsItem;
@BindView(R.id.news_image)
ImageView newsImage;
@BindView(R.id.tv_title)
TextView tvTitle;
@BindView(R.id.play_video_bt)
Button playVideoBt;
@BindView(R.id.news_main)
LinearLayout news_main;
public ContentViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
class ADViewHolder extends ViewHolder {
@BindView(R.id.ad_item)
LinearLayout ad_item;
@BindView(R.id.ad_image_image)
ImageView ad_image_image;
public ADViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
private void bindData() {
}
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
}
@Override
public int getItemCount() {
return homeNewsDataModels.size();
}
}
news_item_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/news_item"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="@dimen/generic_content_padding">
<LinearLayout
android:id="@+id/news_main"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="visible"
>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/news_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:src="@drawable/img_place_holder"/>
<Button
android:id="@+id/play_video_bt"
android:layout_width="50dp"
android:layout_height="40dp"
android:visibility="gone"
android:background="@drawable/play_video_icon"
android:layout_centerInParent="true"
/>
</RelativeLayout>
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Title 1"
android:textSize="@dimen/text_medium_small"
android:maxLines="2"
android:textColor="@color/app_black"
android:layout_marginTop="@dimen/generic_content_padding"
/>
</LinearLayout>
</LinearLayout>
ad_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/ad_item"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/ad_image_image"
android:layout_width="match_parent"
android:layout_height="100dp"
android:adjustViewBounds="true"
android:src="@drawable/img_place_holder"/>
</LinearLayout>
好的,所以我终于找到了解决方案。我做错的是放错了条件,没有膨胀正确的布局 - ads_layout.
这是最终的适配器 Class。其余的是一样的。 onCreateViewHolder 中的更改,每 4 个项目后在位置 5 展开广告布局。
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View v = null;
if (viewType == CONTENT_TYPE) {
v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.news_item_layout, viewGroup, false);
return new ContentViewHolder(v);
} else {
v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.ad_layout, viewGroup, false);
return new ADViewHolder(v);
}
}
以及以下函数的一些变化:
@Override
public int getItemViewType(int position) {
if ((position+1) % 5 == 0 && (position+1) != 1) {
return AD_TYPE;
}
return CONTENT_TYPE;
}
希望它能对以后的人有所帮助。谢谢
我正在使用 Recycler View,其中我必须在 GridLayout Manager 中显示两个项目并且跨度数为 2。
GridLayoutManager gridLayoutManager;
gridLayoutManager = new GridLayoutManager(getActivity(), 2);
newsRecycler.setLayoutManager(gridLayoutManager);
主要问题是我必须在四个项目(即 2 行)之后显示广告 由于跨度计数,将覆盖 mobile.But 的宽度广告也将出现在网格 layout.Any 帮助中将不胜感激!!
输出是这样的:-
预期输出:--
适配器Class:-
public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> {
private List<HomeNewsDataModel> homeNewsDataModels;
public NewsAdapter(FragmentActivity activity, List<HomeNewsDataModel> homeNewsDataModels) {
this.activity = activity;
this.homeNewsDataModels=homeNewsDataModels;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View v = null;
v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.news_item_layout, viewGroup, false);
return new ContentViewHolder(v);
}
}
private final int CONTENT_TYPE=1;
private final int AD_TYPE=2;
@Override
public int getItemViewType(int position)
{
if (position % 4 == 0)
return AD_TYPE;
return CONTENT_TYPE;
}
class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View itemView) {
super(itemView);
}
}
class ContentViewHolder extends ViewHolder {
@BindView(R.id.news_item)
LinearLayout newsItem;
@BindView(R.id.news_image)
ImageView newsImage;
@BindView(R.id.tv_title)
TextView tvTitle;
@BindView(R.id.play_video_bt)
Button playVideoBt;
@BindView(R.id.news_main)
LinearLayout news_main;
public ContentViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
class ADViewHolder extends ViewHolder {
@BindView(R.id.ad_item)
LinearLayout ad_item;
@BindView(R.id.ad_image_image)
ImageView ad_image_image;
public ADViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
private void bindData() {
}
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
}
@Override
public int getItemCount() {
return homeNewsDataModels.size();
}
}
news_item_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/news_item"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="@dimen/generic_content_padding">
<LinearLayout
android:id="@+id/news_main"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="visible"
>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/news_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:src="@drawable/img_place_holder"/>
<Button
android:id="@+id/play_video_bt"
android:layout_width="50dp"
android:layout_height="40dp"
android:visibility="gone"
android:background="@drawable/play_video_icon"
android:layout_centerInParent="true"
/>
</RelativeLayout>
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Title 1"
android:textSize="@dimen/text_medium_small"
android:maxLines="2"
android:textColor="@color/app_black"
android:layout_marginTop="@dimen/generic_content_padding"
/>
</LinearLayout>
</LinearLayout>
ad_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/ad_item"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/ad_image_image"
android:layout_width="match_parent"
android:layout_height="100dp"
android:adjustViewBounds="true"
android:src="@drawable/img_place_holder"/>
</LinearLayout>
好的,所以我终于找到了解决方案。我做错的是放错了条件,没有膨胀正确的布局 - ads_layout.
这是最终的适配器 Class。其余的是一样的。 onCreateViewHolder 中的更改,每 4 个项目后在位置 5 展开广告布局。
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View v = null;
if (viewType == CONTENT_TYPE) {
v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.news_item_layout, viewGroup, false);
return new ContentViewHolder(v);
} else {
v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.ad_layout, viewGroup, false);
return new ADViewHolder(v);
}
}
以及以下函数的一些变化:
@Override
public int getItemViewType(int position) {
if ((position+1) % 5 == 0 && (position+1) != 1) {
return AD_TYPE;
}
return CONTENT_TYPE;
}
希望它能对以后的人有所帮助。谢谢