每当我 在谷歌官方移动广告库 #11上的https://www.youtube.com/watch?v=LZCZSeFTvyk&t=4srecyclerview
中提到的特定位置从原始 json 和原生 Express 广告中提供项目时。它工作正常,但是每当我从我的服务器获取数据并输入本地 Express 广告时,它的显示错误,我尝试了所有可能的解决方案,如果有人得到解决方案,请告诉我,提前致谢!recyclerview
"java.lang.ClassCastException: Expected item at index 8 to be a Native Express ad."
这是我的代码
MainActivity.java
public class MainActivity extends AppCompatActivity {
int listpostid=0;
RecyclerView.Adapter adapter;
public static final int ITEMS_PER_AD = 8;
private static final int NATIVE_EXPRESS_AD_HEIGHT = 280;
private static final String AD_UNIT_ID = "ca-app-pub-3046089225526967/5092698333";
private RecyclerView mRecyclerView;
private List<Object> mRecyclerViewItems = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(layoutManager);
getPosts();
adapter = new RecyclerViewAdapter(this, mRecyclerViewItems);
mRecyclerView.setAdapter(adapter);
addNativeExpressAds();
setUpAndLoadNativeExpressAds();
}
private void addNativeExpressAds() {
for (int i = 0; i <= mRecyclerViewItems.size(); i += ITEMS_PER_AD) {
if( (mRecyclerViewItems.size() - i == 0) || !(mRecyclerViewItems.get(i) instanceof NativeExpressAdView) ) {
final NativeExpressAdView adView = new NativeExpressAdView(MainActivity.this);
mRecyclerViewItems.add(i, adView);}
}
}
private void setUpAndLoadNativeExpressAds() {
mRecyclerView.post(new Runnable() {
@Override
public void run() {
final float scale = MainActivity.this.getResources().getDisplayMetrics().density;
for (int i = 0; i <= mRecyclerViewItems.size(); i += ITEMS_PER_AD) {
final NativeExpressAdView adView =
(NativeExpressAdView) mRecyclerViewItems.get(i);
final CardView cardView = (CardView) 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);
}
loadNativeExpressAd(0);
}
});
}
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 ad.");
}
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) {
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);
}
});
adView.loadAd(new AdRequest.Builder().build());
}
private void addMenuItemsFromJson() {
try {
String jsonDataString = readJsonDataFromFile();
JSONArray menuItemsJsonArray = new JSONArray(jsonDataString);
for (int i = 0; i < menuItemsJsonArray.length(); ++i) {
JSONObject menuItemObject = menuItemsJsonArray.getJSONObject(i);
String menuItemName = menuItemObject.getString("name");
String menuItemDescription = menuItemObject.getString("description");
String menuItemPrice = menuItemObject.getString("price");
String menuItemCategory = menuItemObject.getString("category");
String menuItemImageName = menuItemObject.getString("photo");
MenuItem menuItem = new MenuItem(menuItemName, menuItemDescription, menuItemPrice,
menuItemCategory, menuItemImageName);
mRecyclerViewItems.add(menuItem);
}
} catch (IOException | JSONException exception) {
Log.e(MainActivity.class.getName(), "Unable to parse JSON file.", exception);
}
}
private String readJsonDataFromFile() throws IOException {
InputStream inputStream = null;
StringBuilder builder = new StringBuilder();
try {
String jsonDataString = null;
inputStream = getResources().openRawResource(R.raw.menu_items_json);
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(inputStream, "UTF-8"));
while ((jsonDataString = bufferedReader.readLine()) != null) {
builder.append(jsonDataString);
}
} finally {
if (inputStream != null) {
inputStream.close();
}
}
return new String(builder);
}
private void getPosts() {
String user_id= "abc";
String BASE_URL="http://campfolio.tk/";
try {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
APIService service = retrofit.create(APIService.class);
Call<List<HomepostsModel>> call = service.getPosts(user_id,listpostid);
call.enqueue(new Callback<List<HomepostsModel>>()
{
@Override
public void onResponse(Response<List<HomepostsModel>> response, Retrofit retrofit) {
final List<HomepostsModel> post = response.body();
Gson gson = new Gson();
String listString = gson.toJson(post, new TypeToken<ArrayList<HomepostsModel>>() {}.getType());
JSONArray jsonArray = null;
try {
jsonArray = new JSONArray(listString);
} catch (JSONException e) {
e.printStackTrace();
}
for (int i = 0; i < jsonArray.length(); ++i) {
try {JSONObject menuItemObject = jsonArray.getJSONObject(i);
String post_id = menuItemObject.getString("post_id");
String post_title = menuItemObject.getString("post_title");
String post_content = menuItemObject.getString("post_content");
String likes = menuItemObject.getString("likes");
String post_date = menuItemObject.getString("post_date");
String username = menuItemObject.getString("user_name");
String userImage = menuItemObject.getString("user_image");
String user_email = menuItemObject.getString("user_email");
String like_status = menuItemObject.getString("like_status");
Toast.makeText(MainActivity.this,username,Toast.LENGTH_SHORT).show();
HomepostsModel items = new HomepostsModel(userImage, username, post_date, post_title, post_content, post_id, user_email, like_status, likes);//,post_date,post_title,post_id,user_email,likes);
mRecyclerViewItems.add(items);
adapter.notifyItemInserted(mRecyclerViewItems.size());
} catch (JSONException e) {
e.printStackTrace();}
}}
@Override
public void onFailure(Throwable t) {
}});
} catch (Exception e) {
Log.d("onResponse", "There is an error"); }}
}
RecyclerViewAdapter.java
class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int MENU_ITEM_VIEW_TYPE = 0;
String url = "http://campfolio.tk/"
private static final int NATIVE_EXPRESS_AD_VIEW_TYPE = 1;
private final Context mContext;
private final List<Object> mRecyclerViewItems;
public RecyclerViewAdapter(Context context, List<Object> recyclerViewItems) {
this.mContext = context;
this.mRecyclerViewItems = recyclerViewItems;
}
public class MenuItemViewHolder extends RecyclerView.ViewHolder {
ImageView user_img,img;
final TextView tvuserName,tvpostdate,tvpostid,tvuserEmail,tvposttitle,tvLikes,tvlikescount
public Button btncomment,btnshare,btnspam;
MenuItemViewHolder(View view) {
super(view);
menuItemDescription = (TextView) view.findViewById(R.id.menu_item_description);
user_img = (ImageView) view.findViewById(R.id.single_item_icon_imageView);
tvuserName = (TextView) view.findViewById(R.id.single_user_id);
tvpostdate = (TextView) view.findViewById(R.id.single_post_date);
tvpostid = (TextView) view.findViewById(R.id.PostId);
tvuserEmail = (TextView) view.findViewById(R.id.useremail);
tvposttitle = (TextView) view.findViewById(R.id.single_post_title);
img = (ImageView) view.findViewById(R.id.img);
tvLikes = (TextView) view.findViewById(R.id.likes);
tvlikescount = (TextView) view.findViewById(R.id.likesCount);
btncomment = (Button) view.findViewById(R.id.post_comment);
btnshare = (Button) view.findViewById(R.id.share);
btnspam = (Button) view.findViewById(R.id.spam);
}
}
public class NativeExpressAdViewHolder extends RecyclerView.ViewHolder {
NativeExpressAdViewHolder(View view) {
super(view);
}
}
@Override
public int getItemCount() {
return mRecyclerViewItems.size();
}
@Override
public int getItemViewType(int position) {
return (position ==0) ? NATIVE_EXPRESS_AD_VIEW_TYPE
: MENU_ITEM_VIEW_TYPE;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
switch (viewType) {
case MENU_ITEM_VIEW_TYPE:
View menuItemLayoutView = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.menu_item_container, viewGroup, false);
return new MenuItemViewHolder(menuItemLayoutView);
case NATIVE_EXPRESS_AD_VIEW_TYPE:
// 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(RecyclerView.ViewHolder holder, int position) {
int viewType = getItemViewType(position);
switch (viewType) {
case MENU_ITEM_VIEW_TYPE:
MenuItemViewHolder menuItemHolder = (MenuItemViewHolder) holder;
final HomepostsModel post = (HomepostsModel) mRecyclerViewItems.get(position);
menuItemHolder.tvuserName.setText(post.getUser_name());
menuItemHolder.tvpostdate.setText(post.getPost_date());
menuItemHolder.tvpostid.setText(post.getPost_id());
menuItemHolder.tvuserEmail.setText(post.getUser_email());
menuItemHolder.tvposttitle.setText(post.getPost_title());
//holder.tvLikes.setText(post.getLikes());
menuItemHolder.tvlikescount.setText(post.getLikes());
if (!post.getPost_content().equals("")) {
menuItemHolder.img.setVisibility(View.VISIBLE);
ObjectAnimator animationIMG = ObjectAnimator.ofFloat(menuItemHolder.img, "alpha", 0f, 0.50f, 1f);
animationIMG.setDuration(1500);
animationIMG.start();
ObjectAnimator animationtitle = ObjectAnimator.ofFloat(menuItemHolder.tvposttitle, "alpha", 0f, 0.50f, 1f);
animationtitle.setDuration(1500);
animationtitle.start();
Picasso.with(mContext).load(url + post.getPost_content())
.resize(1100,800)
.centerInside()
.into(menuItemHolder.img);
} else {
menuItemHolder.img.setVisibility(View.GONE);
}
ObjectAnimator animationuser_img = ObjectAnimator.ofFloat(menuItemHolder.user_img, "alpha", 0f, 0.50f, 1f);
animationuser_img.setDuration(500);
animationuser_img.start();
Picasso.with(mContext).load(url + post.getUser_image())
.resize(100, 100)
.centerCrop()
.into(menuItemHolder.user_img);
break;
case NATIVE_EXPRESS_AD_VIEW_TYPE:
// fall through
default:
NativeExpressAdViewHolder nativeExpressHolder =
(NativeExpressAdViewHolder) holder;
NativeExpressAdView adView =
(NativeExpressAdView) mRecyclerViewItems.get(position);
ViewGroup adCardView = (ViewGroup) nativeExpressHolder.itemView;
if (adCardView.getChildCount() > 0) {
adCardView.removeAllViews();
}
if (adView.getParent() != null) {
((ViewGroup) adView.getParent()).removeView(adView);
}
adCardView.addView(adView);
}
}
}