我一直在RecyclerView和Google Volley工作,用于解析JSON。然后我添加了谷歌原生广告!
我关注此link
的教程所以我确实改变了像Google开发者指南一样的RecyclerViewAdapter!
它说列表必须是对象列表(列表)所以我在适配器中改变了这个和其他一些东西!
然后Android Studio显示没有错误,我可以启动应用程序。但是,当我打算用上面提到的RecyclerView打开Fragment时,它会崩溃。
它说:
java.lang.ClassCastException:com.graciaapps.nameoncards.instance.greetoptions.SubOptionOneInstance无法强制转换为com.google.android.gms.ads.NativeExpressAdView
这是关于onBindViewHolder的以下行
NativeExpressAdView adView =(NativeExpressAdView)greetingInstanceList.get(position);
FirstFragment.java
public class FirstFragment extends Fragment {
RecyclerView recyclerView;
List<Object> subOptionOneInstanceList = new ArrayList<Object>();
View viewMain;
Bitmap rectBitmap,squareBitmap;
int countOfBitmap;
private String TAG = getClass().getName();
public String mainCategory,mainTitle;
SwipeRefreshLayout srl_first_fragment;
String JSON_TAG_CATEGORY = "";
// NATIVE EXPRESS ADS
public static final int ITEMS_PER_AD = 8;
private static final int NATIVE_EXPRESS_AD_HEIGHT = 150;
// The Native Express ad unit ID.
public static final String AD_UNIT_ID = "ca-app-pub-3940256099942544/1072772517";
public FirstFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
viewMain = inflater.inflate(R.layout.fragment_first, container, false);
setReference();
checkConnection();
return viewMain;
}
private void setReference() {
srl_first_fragment = (SwipeRefreshLayout) viewMain.findViewById(R.id.srl_first_fragment);
srl_first_fragment.setColorSchemeColors(ContextCompat.getColor(getActivity(),R.color.colorPrimary));
// progressDialog = new ProgressDialog(getContext(),"Processing..",R.color.colorPrimary);
}
private void checkConnection() {
boolean isConnected = EndPoints.isHavingNetworkConnection(getActivity());
if(!isConnected)
{
if(srl_first_fragment != null) {
if (srl_first_fragment.isRefreshing()) {
srl_first_fragment.setRefreshing(false);
}
}
Snackbar.make(viewMain,"Not Connected to internet.",Snackbar.LENGTH_INDEFINITE).setAction("Try Again", new View.OnClickListener() {
@Override
public void onClick(View v) {
checkConnection();
}
}).setActionTextColor(Color.RED).show();
}
else
{
srl_first_fragment.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
checkConnection();
subOptionOneInstanceList.clear();
// subOptionOneAdapter.notifyDataSetChanged();
if(mainCategory.equals(getString(R.string.birthday)) && mainTitle.equals("Greetings"))
{
sendBirthdayGreetingRequest();
JSON_TAG_CATEGORY = "birthday_greetings";
}
if(mainCategory.equals(getString(R.string.wedding)) && mainTitle.equals("Greetings"))
{
sendWeddingGreetingRequest();
JSON_TAG_CATEGORY = "wedding_greetings";
}
}
});
RecyclerView.LayoutManager gridLayoutManager = new GridLayoutManager(getActivity(),2,LinearLayoutManager.VERTICAL,false);
// gridLayoutManager.scrollToPositionWithOffset(1,0);
recyclerView = (RecyclerView) viewMain.findViewById(R.id.rvFirstFragment);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(gridLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
// progressDialog.setCanceledOnTouchOutside(false);
// progressDialog.setCancelable(false);
try {
Log.d(TAG,"SELECTED CATEGORY FOR FIRST FRAGMENT"+getActivity().getIntent().getExtras().getString("category"));
Log.d(TAG,"SELECTED CATEGORY FOR FIRST FRAGMENT"+ EndPoints.CATEGORY_ONE);
mainCategory = getActivity().getIntent().getExtras().getString("category");
mainTitle = EndPoints.CATEGORY_ONE;
if(mainCategory.equals(getString(R.string.birthday)) && mainTitle.equals("Greetings"))
{
sendBirthdayGreetingRequest();
JSON_TAG_CATEGORY = "birthday_greetings";
}
if(mainCategory.equals(getString(R.string.wedding)) && mainTitle.equals("Greetings"))
{
sendWeddingGreetingRequest();
JSON_TAG_CATEGORY = "wedding_greetings";
}
} catch (Exception e) {
e.printStackTrace();
}
addNativeExpressAds();
setUpAndLoadNativeExpressAds();
RecyclerView.Adapter subOptionOneAdapter = new SubOptionOneAdapter(getActivity(),subOptionOneInstanceList);
recyclerView.setAdapter(subOptionOneAdapter);
}
}
private void addNativeExpressAds() {
// Loop through the items array and place a new Native Express ad in every ith position in
// the items List.
for (int i = 0; i <= subOptionOneInstanceList.size(); i += ITEMS_PER_AD) {
final NativeExpressAdView adView = new NativeExpressAdView(this.getContext());
subOptionOneInstanceList.add(i, adView);
}
}
private void setUpAndLoadNativeExpressAds() {
// Use a Runnable to ensure that the RecyclerView has been laid out before setting the
// ad size for the Native Express ad. This allows us to set the Native Express ad's
// width to match the full width of the RecyclerView.
recyclerView.post(new Runnable() {
@Override
public void run() {
final float scale = getActivity().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 <= subOptionOneInstanceList.size(); i += ITEMS_PER_AD) {
final NativeExpressAdView adView = (NativeExpressAdView) subOptionOneInstanceList.get(i);
final CardView cardView = (CardView) getActivity().findViewById(R.id.ad_card_view);
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(0);
}
});
}
private void loadNativeExpressAd(final int index) {
if (index >= subOptionOneInstanceList.size()) {
return;
}
Object item = subOptionOneInstanceList.get(index);
if (!(item instanceof NativeExpressAdView)) {
throw new ClassCastException("Expected item at index " + index + " to be a Native" + " Express ad.");
}
final NativeExpressAdView adView = (NativeExpressAdView) item;
// Set an AdListener on the NativeExpressAdView to wait for the previous Native Express ad
// to finish loading before loading the next ad in the items list.
adView.setAdListener(new AdListener() {
@Override
public void onAdLoaded() {
super.onAdLoaded();
// The previous Native Express ad loaded successfully, call this method again to
// load the next ad in the items list.
loadNativeExpressAd(index + ITEMS_PER_AD);
}
@Override
public void onAdFailedToLoad(int errorCode) {
// The previous Native Express ad failed to load. Call this method again to load
// the next ad in the items list.
Log.e("MainActivity", "The previous Native Express ad failed to load. Attempting to"
+ " load the next Native Express ad in the items list.");
loadNativeExpressAd(index + ITEMS_PER_AD);
}
});
// Load the Native Express ad.
adView.loadAd(new AdRequest.Builder().build());
}
private void sendBirthdayGreetingRequest() {
StringRequest stringRequest = new StringRequest(EndPoints.BIRTHDAY_GREETINGS_URL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
showJSON(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d(TAG,"ERROR IN RESPONSE"+error.getMessage());
if(srl_first_fragment.isRefreshing())
{
srl_first_fragment.setRefreshing(false);
}
}
});
RequestQueue requestQueue = Volley.newRequestQueue(getContext());
requestQueue.add(stringRequest);
}
private void sendWeddingGreetingRequest() {
StringRequest stringRequest = new StringRequest(EndPoints.WEDDING_GREETINGS_URL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
showJSON(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d(TAG,"ERROR IN RESPONSE"+error.getMessage());
if(srl_first_fragment.isRefreshing())
{
srl_first_fragment.setRefreshing(false);
}
}
});
RequestQueue requestQueue = Volley.newRequestQueue(getContext());
requestQueue.add(stringRequest);
}
private void showJSON(String response) {
Log.d(TAG, "RESPONSE" + response);
try {
JSONObject jsonObject = new JSONObject(response);
JSONArray jsonArray = jsonObject.getJSONArray(JSON_TAG_CATEGORY);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonInnerObject = jsonArray.getJSONObject(i);
Log.d(TAG, "ID WOULD BE " + jsonInnerObject.getInt(EndPoints.TAG_ID));
Log.d(TAG, "CATEGORY WOULD BE " + jsonInnerObject.getString(EndPoints.TAG_CATEGORY));
Log.d(TAG, "IS FRAME WOULD BE " + jsonInnerObject.getString(EndPoints.TAG_ISFRAME));
Log.d(TAG, "ORIGINAL IMAGE URL WOULD BE " + jsonInnerObject.getString(EndPoints.TAG_ORIGINAL_IMAGE_URL));
Log.d(TAG, "SAMPLE IMAGE URL WOULD BE " + jsonInnerObject.getString(EndPoints.TAG_SAMPLE_IMAGE_URL));
Log.d(TAG, "FONT STYLE WOULD BE " + jsonInnerObject.getString(EndPoints.TAG_FONT_STYLE));
Log.d(TAG, "FONT COLOR WOULD BE " + jsonInnerObject.getString(EndPoints.TAG_FONT_COLOR));
Log.d(TAG, "FONT SIZE WOULD BE " + jsonInnerObject.getInt(EndPoints.TAG_FONT_SIZE));
Log.d(TAG, "OTHER FONT STYLE WOULD BE " + jsonInnerObject.getString(EndPoints.TAG_OTHER_FONT_STYLE));
Log.d(TAG, "OTHER FONT COLOR WOULD BE " + jsonInnerObject.getString(EndPoints.TAG_OTHER_FONT_COLOR));
Log.d(TAG, "OTHER FONT SIZE WOULD BE " + jsonInnerObject.getString(EndPoints.TAG_OTHER_FONT_SIZE));
Log.d(TAG, "OTHER FONT MAX LENGTH WOULD BE " + jsonInnerObject.getString(EndPoints.TAG_OTHER_FONT_MAX_LENGTH));
if(EndPoints.TAG_OTHER_FONT_SIZE.matches(""))
{
EndPoints.TAG_OTHER_FONT_SIZE="0";
}
if(EndPoints.TAG_OTHER_FONT_MAX_LENGTH.matches(""))
{
EndPoints.TAG_OTHER_FONT_MAX_LENGTH="0";
}
SubOptionOneInstance cardInstance = new SubOptionOneInstance(
jsonInnerObject.getInt(EndPoints.TAG_ID),
jsonInnerObject.getString(EndPoints.TAG_CATEGORY),
jsonInnerObject.getBoolean(EndPoints.TAG_ISFRAME),
jsonInnerObject.getString(EndPoints.TAG_ORIGINAL_IMAGE_URL),
jsonInnerObject.getString(EndPoints.TAG_SAMPLE_IMAGE_URL),
jsonInnerObject.getString(EndPoints.TAG_FONT_STYLE),
jsonInnerObject.getString(EndPoints.TAG_FONT_COLOR),
jsonInnerObject.getInt(EndPoints.TAG_FONT_SIZE),
jsonInnerObject.getInt(EndPoints.TAG_FONT_MAX_LENGTH),
jsonInnerObject.getString(EndPoints.TAG_OTHER_FONT_STYLE),
jsonInnerObject.getString(EndPoints.TAG_OTHER_FONT_COLOR),
jsonInnerObject.getString(EndPoints.TAG_OTHER_FONT_SIZE),
jsonInnerObject.getString(EndPoints.TAG_OTHER_FONT_MAX_LENGTH));
subOptionOneInstanceList.add(cardInstance);
}
// subOptionOneAdapter.notifyDataSetChanged();
if (srl_first_fragment.isRefreshing()){
srl_first_fragment.setRefreshing(false);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
SubOptionOneAdapter.java
package com.cards.adapter.greetoptions;
public class SubOptionOneAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<Object> greetingInstanceList;
Activity activity;
private String TAG = getClass().getName();
private static final int MENU_ITEM_VIEW_TYPE = 0;
private static final int AD_VIEW = 1;
public SubOptionOneAdapter() {
}
public SubOptionOneAdapter(Activity activity, List<Object> greetingInstanceList) {
this.greetingInstanceList = greetingInstanceList;
this.activity = activity;
}
public class MenuItemViewHolder extends RecyclerView.ViewHolder{
ImageView imageView;
TextView tvCount;
ProgressBar progressBar;
public MenuItemViewHolder(View itemView) {
super(itemView);
imageView = (ImageView) itemView.findViewById(R.id.ivLatestCardImage);
tvCount = (TextView) itemView.findViewById(R.id.tvLatestCardTitle);
progressBar = (ProgressBar) itemView.findViewById(R.id.pbBeforeImage);
progressBar.setVisibility(View.VISIBLE);
}
}
public class NativeExpressAdViewHolder extends RecyclerView.ViewHolder{
public NativeExpressAdViewHolder(View itemView) {
super(itemView);
}
}
@Override
public int getItemCount() {
return greetingInstanceList.size();
}
@Override
public int getItemViewType(int position) {
return (position % FirstFragment.ITEMS_PER_AD == 0) ? AD_VIEW : MENU_ITEM_VIEW_TYPE;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
switch (viewType)
{
case MENU_ITEM_VIEW_TYPE:
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.latest_list_row,viewGroup,false);
return new MenuItemViewHolder(view);
case AD_VIEW:
// fall through
default:
View nativeExpressLayoutView = LayoutInflater.from(
viewGroup.getContext()).inflate(R.layout.native_express_ad_container,
viewGroup, false);
return new NativeExpressAdViewHolder(nativeExpressLayoutView);
}
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
int viewType = getItemViewType(position);
switch (viewType) {
case MENU_ITEM_VIEW_TYPE:
final MenuItemViewHolder menuItemViewHolder = (MenuItemViewHolder)holder;
final SubOptionOneInstance subOptionOneInstance = (SubOptionOneInstance) greetingInstanceList.get(position);
EndPoints.CUSTOM_ID = "" + subOptionOneInstance.getId();
Picasso.with(activity)
.load(subOptionOneInstance.getSample_image_url())
.error(R.drawable.ic_cancel_red)
.networkPolicy(NetworkPolicy.OFFLINE)
.into(menuItemViewHolder.imageView, new Callback() {
@Override
public void onSuccess() {
if (menuItemViewHolder.progressBar.getVisibility() == View.VISIBLE) {
menuItemViewHolder.progressBar.setVisibility(View.GONE);
}
}
@Override
public void onError() {
if (menuItemViewHolder.progressBar.getVisibility() == View.VISIBLE) {
menuItemViewHolder.progressBar.setVisibility(View.GONE);
}
Picasso.with(activity)
.load(subOptionOneInstance.getSample_image_url())
.error(R.drawable.ic_cancel_red)
.into(menuItemViewHolder.imageView, new Callback() {
@Override
public void onSuccess() {
}
@Override
public void onError() {
Log.d(TAG, "PICASSO COULD NOT FETCH IMAGE");
}
});
}
});
menuItemViewHolder.tvCount.setText(Integer.toString(subOptionOneInstance.getId()));
menuItemViewHolder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SubOptionOneInstance instance = (SubOptionOneInstance) greetingInstanceList.get(position);
Intent intent = new Intent(activity, CardMaker.class);
activity.startActivity(intent);
intent.putExtra("id", "" + instance.getId());
EndPoints.CUSTOM_ID = "" + instance.getId();
EndPoints.CUSTOM_CATEGORY = "" + instance.getCategory();
Log.d(TAG, "ID TO BE SEND: " + instance.getId());
activity.overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
}
});
break;
case AD_VIEW:
// fall through
default:
NativeExpressAdViewHolder nativeExpressAdViewHolder = (NativeExpressAdViewHolder)holder;
NativeExpressAdView nativeExpressAdView = (NativeExpressAdView) greetingInstanceList.get(position);
ViewGroup adCardView = (ViewGroup) nativeExpressAdViewHolder.itemView;
if(adCardView.getChildCount() >= 0)
{
adCardView.removeAllViews();
}
if (nativeExpressAdView.getParent() != null) {
((ViewGroup) nativeExpressAdView.getParent()).removeView(nativeExpressAdView);
}
// Add the Native Express ad to the native express ad View.
adCardView.addView(nativeExpressAdView);
}
}
}
任何帮助将不胜感激!