Таким образом, у вас есть List<Post>
и Ads
двух типов данных, которые необходимо представить в один RecyclerView
. Итак, теперь вам нужно объединить обе данные в один источник данных, который будет использоваться в RecyclerView
.
Вот пример:
Первый : создайте класс данных, который объединит Post
и Ads
с именем PostAdsData
:
public class PostAdsData {
public int getType() {
return type;
}
public UnifiedNativeAd getAds() {
return ads;
}
public Post getPost() {
return post;
}
public int type; // 1 is ads and 2 is post
public UnifiedNativeAd ads;
public Post post;
}
Второй: Ваш адаптер должен выглядеть следующим образом:
public class YourAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
// A menu item view type.
private static final int MENU_ITEM_VIEW_TYPE = 0;
// The unified native ad view type.
private static final int UNIFIED_NATIVE_AD_VIEW_TYPE = 1;
public List<PostAdsData> postAdsDataList;
public PostAdapter(Context mContext) {
this.context = mContext;
}
public void setPostAdsDataList(List<PostAdsData> postAdsData){ // we set the data for the recyclerView here
this.postAdsDataList = postAdsData;
notifyDataSetChanged();
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
switch (viewType) {
// here do your thing as usual
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, final int position) {
int viewType = getItemViewType(position);
switch (viewType){
// here switch viewType as usual,but refer the data from postAdsDataList
}
}
@Override
public int getItemViewType(int position) {
if(postAdsDataList.get(position).getType() == 1){
return UNIFIED_NATIVE_AD_VIEW_TYPE;
}else{
return MENU_ITEM_VIEW_TYPE;
}
}
@Override
public int getItemCount() {
if (postAdsDataList != null) {
return postAdsDataList.size();
} else {
return 0;
}
}
}
Третий: в вашем HomeActivity
, так что здесь вам нужно установить data (Post) в RecyclerView
, вам необходимо «преобразовать» данные внутри List<Post>
в List<PostAdsData>
следующим образом:
private void displayContent(List<Post> posts){
List<PostAdsData> postAdsDataList = new ArrayList<>();
for(Post item : posts) {
PostAdsData data = new PostAdsData();
data.ads = null;
data.post = item;
data.type = 2; // here 1 for ads, 2 will be post
postAdsDataList.add(data);
}
yourAdapter.setPostAdsDataList(postAdsDataList); // here set in the Posts data into the recyclerView
}
displayContent()
Функция выше должна вызываться после получения Данные из Firebase я предположил. Так это будет выглядеть так:
private void displayPosts(){
//ALL OTHER STUFF
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(....){
// after your for loop
// then all the Post will added inside the List<Post>
}
// then we called here
displayContent(postList) // your postList
}
}
Итак, мы закончили вставку posts
. Поэтому, когда вы получаете UnifiedNativeAd
от Google Admob, нам также необходимо «преобразовать» UnifiedNativeAd
в postAdsData
объект, например так:
// add this to YourAdapter class
public void insertAdsToRecyclerView(UnifiedNativeAd ad){ // if more than 1 ads,then here should be a list,and use for loop at the code below
PostAdsData adsData = new PostAdsData();
adsData.post = null;
adsData.ads = ad;
adsData.type = 1;
postAdsDataList.add(0,adsData); // here will add the ads to the 1st item of the list
notifyItemInserted(0);
}
Тогда в вашем insertAdsInMenuItems()
станет это:
private void insertAdsInMenuItems() {
postAdapter.insertAdsToRecyclerView(mNativeAds.get(0))// cause i seen you request for 1 ad only
}
Надеюсь, вы поняли идею. Теперь мы успешно объединили Post
и Ad
в 1 источник данных. Так что нам будет проще представить в RecylerView
.