Ich arbeite an einer Android-App, die Daten von JSON Url abrufen und in Recyclerview anzeigen. Ich möchte native Anzeigen zwischen Elementen hinzufügen, also füge ich NativeExpressAdView in Recyclerview hinzu, indem ich diesem Tutorial Git Hub Tutorial folge. ich Störung erhalte auf onBindViewHolder()Wie NativeAdExpressView RecyclerView und Volley zusammen implementieren?
Fehler, die ich bekommen habe ist
ava.lang.ClassCastException: com.sctar.moviestime.myRecycler.GetDataAdapter nicht com.google.android.gms gegossen werden kann. ads.NativeExpressAdView bei com.sctar.moviestime.myRecycler.MyAdapter.onBindViewHolder (MyAdapter.java:119
MyAdapter.java
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
Context mContext;
private List<Object> mRecyclerViewItems;
private static final int MOVIE_ITEM_VIEW_TYPE=0;
private static final int SCROLL_AD_VIEW=1;
public MyAdapter(Context context,List<Object> mRecyclerViewItems)
{
super();
this.mContext=context;
this.mRecyclerViewItems=mRecyclerViewItems;
}
public class MoviesItemViewHolder extends RecyclerView.ViewHolder {
public TextView movieNameTV,movieGenreTV;
public YouTubeThumbnailView videoThumbnail;
public String movie_url="";
public MoviesItemViewHolder(View mView) {
super(mView);
movieNameTV=(TextView)mView.findViewById(R.id.movieNameTV);
movieGenreTV=(TextView)mView.findViewById(R.id.movieGenre);
videoThumbnail=(YouTubeThumbnailView)mView.findViewById(R.id.thumbnailView1);
videoThumbnail.initialize(DeveloperKey.DEV_KEY, new YouTubeThumbnailView.OnInitializedListener() {
@Override
public void onInitializationSuccess(YouTubeThumbnailView youTubeThumbnailView, final YouTubeThumbnailLoader youTubeThumbnailLoader) {
youTubeThumbnailLoader.setVideo(movie_url);
youTubeThumbnailLoader.setOnThumbnailLoadedListener(new YouTubeThumbnailLoader.OnThumbnailLoadedListener() {
@Override
public void onThumbnailLoaded(YouTubeThumbnailView youTubeThumbnailView, String s) {
youTubeThumbnailLoader.release();
}
@Override
public void onThumbnailError(YouTubeThumbnailView youTubeThumbnailView, YouTubeThumbnailLoader.ErrorReason errorReason) {
}
});
}
@Override
public void onInitializationFailure(YouTubeThumbnailView youTubeThumbnailView, YouTubeInitializationResult youTubeInitializationResult) {
}
});
}
}
public class NativeExpressViewHolder extends RecyclerView.ViewHolder
{
public NativeExpressViewHolder(View itemView) {
super(itemView);
}
}
@Override
public int getItemCount() {
return mRecyclerViewItems.size();
}
@Override
public int getItemViewType(int position) {
return (position%HomeFragment.ITEMS_PER_AD==0)?SCROLL_AD_VIEW:MOVIE_ITEM_VIEW_TYPE;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case SCROLL_AD_VIEW:
View scroll_ad_layout=LayoutInflater.from(parent.getContext()).inflate(R.layout.scroll_ad_layout,parent,false);
return new NativeExpressViewHolder(scroll_ad_layout);
case MOVIE_ITEM_VIEW_TYPE:
//Fall through
default:
View movie_item_view = LayoutInflater.from(parent.getContext()).inflate(R.layout.movie_card, parent, false);
return new MoviesItemViewHolder(movie_item_view);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
int viewType = getItemViewType(position);
switch (viewType) {
case SCROLL_AD_VIEW:
NativeExpressViewHolder nativeExpressViewHolder = (NativeExpressViewHolder) holder;
NativeExpressAdView nativeExpressAdView= (NativeExpressAdView) mRecyclerViewItems.get(position);
ViewGroup adCardView = (ViewGroup) nativeExpressViewHolder.itemView;
adCardView.removeAllViews();
if (adCardView.getChildCount() > 0) {
adCardView.removeAllViews();
}
if (nativeExpressAdView.getParent() != null) {
((ViewGroup) nativeExpressAdView.getParent()).removeView(nativeExpressAdView);
}
adCardView.addView(nativeExpressAdView);
break;
case MOVIE_ITEM_VIEW_TYPE:
//Fall Through
default:
MoviesItemViewHolder moviesItemViewHolder = (MoviesItemViewHolder) holder;
GetDataAdapter cardItem = (GetDataAdapter) mRecyclerViewItems.get(position);
moviesItemViewHolder.movieNameTV.setText(cardItem.getName());
moviesItemViewHolder.movieGenreTV.setText(cardItem.getGenre());
moviesItemViewHolder.movie_url = cardItem.getMovie_url();
break;
}
}
}
HomeFragment.java Klasse
public class HomeFragment extends Fragment {
YouTubePlayerSupportFragment youTubePlayerFragment;
RecyclerView recyclerView;
String GET_JSON_DATA_URL="http://sctar.com/moviestime/admin/getMovie.php?page=";
String JSON_NAME="movie_name";
String JSON_GENRE="movie_genre";
String JSON_URL="movie_url";
JsonArrayRequest jsonArrayRequest;
RequestQueue requestQueue;
TextView movieName,play_movieName;
EqualizerView equalizerView;
ProgressBar progressBar;
private int pageNumber=1;
GetDataAdapter cardItem;
private List<Object> mRecyclerViewItems;
public static final int ITEMS_PER_AD=8;
private static final int NATIVE_EXPRESS_AD_HEIGHT=150;
private static final String AD_UNIT_ID="ca-app-pub-1094536469217749/8160042117";
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.home_fragment,container,false);
setRetainInstance(true);
recyclerView=(RecyclerView)view.findViewById(R.id.homeRV);
recyclerView.setHasFixedSize(true);
movieName=(TextView)view.findViewById(R.id.movieNameTV);
play_movieName=(TextView)view.findViewById(R.id.play_movieNameTV);
//Specify a Layout Manager
RecyclerView.LayoutManager linearLayoutManager=new LinearLayoutManager(this.getActivity());
recyclerView.setLayoutManager(linearLayoutManager);
mRecyclerViewItems=new ArrayList<>();
progressBar=(ProgressBar)view.findViewById(R.id.progressBar);
equalizerView=(EqualizerView)view.findViewById(R.id.equalizer_view);
//Update RecyclerView Items
//addData();
youTubePlayerFragment=YouTubePlayerSupportFragment.newInstance();
FragmentTransaction fragmentTransaction=getChildFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.youtube_fragment,youTubePlayerFragment).commit();
ItemClickSupport.addTo(recyclerView).setOnItemClickListener(new ItemClickSupport.OnItemClickListener() {
@Override
public void onItemClicked(RecyclerView recyclerView, final int position, View v) {
youTubePlayerFragment.initialize(DeveloperKey.DEV_KEY, new YouTubePlayer.OnInitializedListener() {
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer yPlayer, boolean b) {
if(!b)
{
cardItem=(GetDataAdapter)mRecyclerViewItems.get(position);
String movie_url=cardItem.getMovie_url();
yPlayer.setPlayerStyle(YouTubePlayer.PlayerStyle.DEFAULT);
yPlayer.setFullscreenControlFlags(YouTubePlayer.FULLSCREEN_FLAG_CONTROL_ORIENTATION);
//yPlayer.setFullscreenControlFlags(YouTubePlayer.FULLSCREEN_FLAG_ALWAYS_FULLSCREEN_IN_LANDSCAPE);
yPlayer.loadVideo(movie_url);
yPlayer.play();
equalizerView.animateBars();
}
}
@Override
public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {
}
});
youTubePlayerFragment.onDestroy();
}
});
//Get Data from the Server
addData();
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if(isLastItemDisplaying(recyclerView)) {
addData();
}
}
});
}
else {
recyclerView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
@Override
public void onScrollChange(View view, int i, int i1, int i2, int i3) {
if(isLastItemDisplaying(recyclerView))
addData();
}
});
}
// addData();
//Load Native and Banner Ads
addNativeScrollAds();
setupAndLoadNativeAds();
addBannerAds(view);
return view;
}
public void addData()
{
progressBar.setVisibility(View.VISIBLE);
requestQueue=Volley.newRequestQueue(this.getActivity());
requestQueue.add(json_web_call(pageNumber));
pageNumber++;
}
private void addNativeScrollAds(){
Toast.makeText(getActivity(),String.valueOf(mRecyclerViewItems.size()), Toast.LENGTH_SHORT).show();
for(int i=0;i<mRecyclerViewItems.size();i+=ITEMS_PER_AD){
NativeExpressAdView adView=new NativeExpressAdView(this.getActivity());
adView.setAdSize(new AdSize(320,150));
adView.setAdUnitId(AD_UNIT_ID);
adView.loadAd(new AdRequest.Builder().build());
mRecyclerViewItems.add(i,adView);
}
}
public void setupAndLoadNativeAds(){
recyclerView.post(new Runnable() {
@Override
public void run() {
Toast.LENGTH_SHORT).show();
final float scale=getContext().getResources().getDisplayMetrics().density;
// Set the ad size and ad unit ID for each Native Express ad in the items list.
for (int i = 0; i <mRecyclerViewItems.size(); i += ITEMS_PER_AD) {
final NativeExpressAdView adView = (NativeExpressAdView) mRecyclerViewItems.get(i);
CardView cardView=(CardView)getActivity().findViewById(R.id.scrollAdCard);
final int adWidth = cardView.getWidth() - cardView.getPaddingLeft()
- cardView.getPaddingRight();
AdSize adSize = new AdSize((int) (adWidth/scale), NATIVE_EXPRESS_AD_HEIGHT);
adView.setAdSize(adSize);
adView.setAdUnitId(AD_UNIT_ID);
}
// Load the first Native Express ad in the items list.
loadNativeExpressAd(8);
}
});
}
private void loadNativeExpressAd(final int index){
if(index>=mRecyclerViewItems.size()){
return;
}
Object item=mRecyclerViewItems.get(index);
if(!(item instanceof NativeExpressAdView)){
throw new ClassCastException("Expected Item at Index "+index+" to be a Native Express Adview");
}
final NativeExpressAdView adView=(NativeExpressAdView)item;
adView.setAdListener(new AdListener() {
@Override
public void onAdLoaded() {
super.onAdLoaded();
loadNativeExpressAd(index+ITEMS_PER_AD);
}
@Override
public void onAdFailedToLoad(int errorCode) {
super.onAdFailedToLoad(errorCode);
Log.e("HomeFragment","The Previous native ad failed to load, attempting to load next ad in item list");
loadNativeExpressAd(index+ITEMS_PER_AD);
}
});
adView.loadAd(new AdRequest.Builder().build());
// Toast.makeText(getActivity(),String.valueOf(mRecyclerViewItems.size()), Toast.LENGTH_SHORT).show();
}
public void addBannerAds(View view){
AdView bannerAdView=(AdView)view.findViewById(R.id.bannerAdview1);
AdRequest bannerAdRequest=new AdRequest.Builder().addTestDevice("cph1701-a17bc212").build();
bannerAdView.loadAd(bannerAdRequest);
}
public JsonArrayRequest json_web_call(int pageNumber)
{
progressBar.setVisibility(View.VISIBLE);
jsonArrayRequest=new JsonArrayRequest(GET_JSON_DATA_URL+String.valueOf(pageNumber), new Response.Listener<JSONArray>() {
//jsonArrayRequest=new JsonArrayRequest(GET_JSON_DATA_URL, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
json_parse_data(response);
progressBar.setVisibility(View.GONE);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
progressBar.setVisibility(View.GONE);
}
});
return jsonArrayRequest;
//requestQueue=Volley.newRequestQueue(this.getActivity());
//requestQueue.add(jsonArrayRequest);
}
public void json_parse_data(JSONArray array)
{
for(int i=0;i<array.length();i++)
{
try {
JSONObject json=array.getJSONObject(i);
String name=json.getString(JSON_NAME);
String genre=json.getString(JSON_GENRE);
String movie_url=json.getString(JSON_URL);
GetDataAdapter menuItem=new GetDataAdapter(name,genre,movie_url);
//if(i%ITEMS_PER_AD!=0)
mRecyclerViewItems.add(menuItem);
}
catch (JSONException e)
{
e.printStackTrace();
}
}
MyAdapter myAdapter=new MyAdapter(this.getContext(),mRecyclerViewItems);
recyclerView.setAdapter(myAdapter);
}
private boolean isLastItemDisplaying(RecyclerView recyclerView) {
if(recyclerView.getAdapter().getItemCount()!=0){
int lastVisibleItem=((LinearLayoutManager)recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition();
if(lastVisibleItem!=RecyclerView.NO_POSITION && lastVisibleItem==recyclerView.getAdapter().getItemCount()-1)
return true;
}
return false;
}
}
GetDataAdapter Klasse
public class GetDataAdapter {
int id;
String name;
String genre;
String movie_url;
public GetDataAdapter(){
//Default Constructor
}
public GetDataAdapter(String name,String genre,String movie_url){
this.name=name;
this.genre=genre;
this.movie_url=movie_url;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGenre() {
return genre;
}
public void setGenre(String genre) {
this.genre = genre;
}
public String getMovie_url() {
return movie_url;
}
public void setMovie_url(String movie_url) {
this.movie_url = movie_url;
}
}
Vielen Dank für sofortige Hilfe. Ich gehe mit beiden Ansichten um. Lassen Sie mich den Code im Detail teilen. –
Ich habe die Details aktualisiert. Bitte lassen Sie es mich wissen, wenn Sie mir helfen können. Danke im Voraus. :) –
Ich werde einen Blick auf Ihren Code werfen, wenn ich nach Hause komme;) – MatPag