我正在使用Recycler视图,在该视图中,我必须在GridLayout Manager中显示两个项目,跨度计数为2。
GridLayoutManager gridLayoutManager;
gridLayoutManager = new GridLayoutManager(getActivity(), 2);
newsRecycler.setLayoutManager(gridLayoutManager);
主要问题是,我必须在四个项目(即2行)后显示广告,这将覆盖移动的宽度。但是由于跨度计数,广告也在网格布局中出现。任何帮助将不胜感激!
输出如下:-
预期产出:--
适配器类:-
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();
}
}
新闻项目布局。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>
广告版面。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。
这里是最后一个适配器类。其余的都一样。在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;
}
希望它将来能帮助到某人。谢谢。
我在StackOverflow上看到了一些类似的事件。然而,这些似乎都不适用于我的情况。我遇到的问题是,我的RecyclerView正在工作,但没有显示任何内容。我已经运行了多个测试,试图找出它不工作的原因,但所有测试都支持它正常工作的事实。 getItemCount中的日志返回3,这是正确的数字。我只是不明白为什么它没有显示。我回头看了我在以前的活动中做的回收器视图,它们都在一定程度上匹配(其他
问题内容: 我需要添加一个可以列出an元素的位置,并且我发现有一种更新更好的显示列表的方法- 。 我的问题是如何在我的应用程序中实现这一点。我发现我需要使用,但是我不太了解如何正确实现整个过程。 如果你想知道,我指的是这个的文档的例子,这是我一直在读。 编辑: 更新我的代码后,它说它无法解析该符号: 所以我以为我把它放错了地方(很可能),实际上我把它放到Adapter类的末尾,就在Method之后
这是我现在面临的一个奇怪的问题。从我的应用程序中,我从JSON文件中从链接中获取数据,然后用Volley解析它。现在我想在一个看起来不起作用的RecyclerView上显示数据,我很高兴我的代码很好,但是有些东西似乎不起作用,我找不到它。 这是活动代码 HomeActivity.java: 这是我从适配器中扩展的布局,并从JSON文件中设置数据 和适配器类相关的代码,我猜: @Override p
我想要一个recyclerview,当第一个应用程序打开时,然后在创建时从服务器获取一些数据,当向上滚动时,会显示recyclerview下方的进度条,当向上滚动到服务器时再次点击URL,并在先前获取的数据下方获取更多数据。但我知道当我第二次点击URL时,它会刷新页面,并在第二次点击时只显示从服务器获取的数据,但我想要第一次和第二次点击的响应。 对不起,我说英语 以下是我的主要活动代码: }
我有一个离子型应用程序。我想实现cordova admob免费插件。我创建广告单元已经一个多月了。广告在android和ios上都能完美地运行。当我发布到商店时,android运行良好并显示广告,但ios广告不显示。有一个白色区域代替横幅广告。你可以在下面的照片中看到横幅广告。这张照片并不能完全理解,但广告应该出现在空白处。间隙广告和奖励广告根本不显示。此外,在我的admob帐户中,有许多ios请
如何使用网格布局管理器水平显示三行三列的循环视图项目,增加垂直增加的价值,类似于下图