如何在RecyclerAdapter适配器中传递findViewById

时间:2018-11-10 10:58:04

标签: java android

我正在使用Admob。我想在我的回收站视图中显示原生广告,以在列表中的特定位置展示广告。

我的BlogRecyclerAdapter:

public class BlogRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

private static String LOG_TAG = "EXAMPLE";
NativeExpressAdView mAdView;
VideoController mVideoController;

public List<BlogPost> blog_list;
public Context context;
private FirebaseFirestore firebaseFirestore;

private int TYPE_POST = 0;
private int TYPE_ADS = 1;

public BlogRecyclerAdapter(List<BlogPost> blog_list){
    this.context = context;
    this.blog_list = blog_list;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    if(viewType == TYPE_POST){
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.blog_list_item, parent, false);
        context = parent.getContext();
        firebaseFirestore = FirebaseFirestore.getInstance();
        return new PostViewHolder(view);
    }
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.blog_ads, parent, false);
    context = parent.getContext();
    return new AdViewHolder(view);
}

@Override
public int getItemViewType(int position) {
    if((position % 5) == 2){
        return TYPE_ADS;
    }
    return TYPE_POST;


}

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder , final int position) {
    if(getItemViewType(position) == TYPE_POST){

        ((PostViewHolder) holder).setIsRecyclable(false);
        final String desc_data = blog_list.get(position).getDesc();
        ((PostViewHolder) holder).setDescText(desc_data);
        final String image_url = blog_list.get(position).getImage_url();
        final String thumbUri = blog_list.get(position).getImage_thumb();
        ((PostViewHolder) holder).setBlogImage(image_url, thumbUri);
        final String video_url = blog_list.get(position).getVideo_url();
        final String type = blog_list.get(position).getType();
        ((PostViewHolder) holder).setTypeText(type);
        final String season = blog_list.get(position).getSeason();
        ((PostViewHolder) holder).setSeason(season);
        final String episode = blog_list.get(position).getEpisode();
        ((PostViewHolder) holder).setEpisode(episode);
        try {
            long millisecond = blog_list.get(position).getTimestamp().getTime();
            String dateString = DateFormat.format("d,MMM yyyy", new Date(millisecond)).toString();
            ((PostViewHolder) holder).setTime(dateString);
            String dateWeekString = DateFormat.format("EEEE", new Date(millisecond)).toString();
            ((PostViewHolder) holder).setDay(dateWeekString);
        } catch (Exception e) {
            Toast.makeText(context, "Exception : " + e.getMessage(), Toast.LENGTH_SHORT).show();
        }
        ((PostViewHolder) holder).mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG,"OnClick Linierter Activiate :" + blog_list.get(position));
                Intent intent = new Intent(context, Single.class);
                intent.putExtra("desc_data", desc_data);
                intent.putExtra("image_url", image_url);
                intent.putExtra("thumbUri", thumbUri);
                intent.putExtra("video_url", video_url);
                intent.putExtra("type", type);
                context.startActivity(intent);
            }
        });
    }else if(getItemViewType(position) == TYPE_ADS){
        mAdView = (NativeExpressAdView) findViewById(R.id.adView);

        // Set its video options.
        mAdView.setVideoOptions(new VideoOptions.Builder()
                .setStartMuted(true)
                .build());

        // The VideoController can be used to get lifecycle events and info about an ad's video
        // asset. One will always be returned by getVideoController, even if the ad has no video
        // asset.
        mVideoController = mAdView.getVideoController();
        mVideoController.setVideoLifecycleCallbacks(new VideoController.VideoLifecycleCallbacks() {
            @Override
            public void onVideoEnd() {
                Log.d(LOG_TAG, "Video playback is finished.");
                super.onVideoEnd();
            }
        });

        // Set an AdListener for the AdView, so the Activity can take action when an ad has finished
        // loading.
        mAdView.setAdListener(new AdListener() {
            @Override
            public void onAdLoaded() {
                if (mVideoController.hasVideoContent()) {
                    Log.d(LOG_TAG, "Received an ad that contains a video asset.");
                } else {
                    Log.d(LOG_TAG, "Received an ad that does not contain a video asset.");
                }
            }
        });

        mAdView.loadAd(new AdRequest.Builder().build());
    }


}

@Override
public int getItemCount() {
    return blog_list.size();
}

public class PostViewHolder extends RecyclerView.ViewHolder {

    private View mView;
    private TextView descView;
    private ImageView blogImageView;
    private TextView blogDate;
    private TextView blogDay;
    private TextView blogType;
    private TextView blogSeason;
    private TextView blogEpisode;

    public PostViewHolder(View itemView) {
        super(itemView);
        mView = itemView;
    }

    public void setTypeText(String typeText){
        blogType = mView.findViewById(R.id.blog_type);
        blogType.setText(typeText);
    }

    public void setDescText(String descText){
        descView = mView.findViewById(R.id.blog_desc);
        descView.setText(descText);
    }

    public void setBlogImage(String downloadUri, String thumbUri){
        blogImageView = mView.findViewById(R.id.blog_image);
        RequestOptions requestOptions = new RequestOptions();
        requestOptions.placeholder(R.drawable.avatar);
        Glide.with(context).applyDefaultRequestOptions(requestOptions).load(downloadUri).thumbnail(
                Glide.with(context).load(thumbUri)
        ).into(blogImageView);
    }

    public void setSeason(String seasonText){
        blogSeason = mView.findViewById(R.id.blog_season);
        if(seasonText == ""){
            blogSeason.setText(seasonText);
        }else{
            blogSeason.setText(" Season "+seasonText+" ");
        }
    }
    public void setEpisode(String epsiodeText){
        blogEpisode = mView.findViewById(R.id.blog_episode);
        if(epsiodeText == ""){
            blogEpisode.setText(epsiodeText);
        }else{
            blogEpisode.setText(" Episode "+epsiodeText+" ");
        }
    }

    public void setTime(String date) {
        blogDate = mView.findViewById(R.id.blog_date);
        blogDate.setText(date);
    }

    public void setDay(String Day) {
        blogDay = mView.findViewById(R.id.blog_day);
        blogDay.setText(Day);
    }

}

// View Holder for Admob Native Express Ad Unit
public class AdViewHolder extends RecyclerView.ViewHolder {
    AdViewHolder(View view) {
        super(view);
    }
}


public void updateList(List<BlogPost> blog_list){
    this.blog_list = blog_list;
    notifyDataSetChanged();
}
} 

喜欢知道该怎么做:

mAdView = (NativeExpressAdView) findViewById(R.id.adView);

我正在处理NativeExpressAdView,以便在我的recyclerview中显示。

我阅读了所有其他文档,但仍然找不到任何内容。

2 个答案:

答案 0 :(得分:0)

else if(getItemViewType(position) == TYPE_ADS)条件下使用此代码。

mAdView = (NativeExpressAdView)holder.itemView.findViewById(R.id.adView);

RecyclerView.ViewHolder rootView可以由itemView

访问

答案 1 :(得分:0)

如果您使用Android JetPack的dataBinding,则无需费心如何使用findViewById()定义UI窗口小部件。