1

每当我 在谷歌官方移动广告库 #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);
        }
    }

}
4

1 回答 1

0

在定义适配器之前添加以下方法

    addNativeExpressAds();
    setUpAndLoadNativeExpressAds();

它应该如下所示

    getPosts();
    addNativeExpressAds();
    setUpAndLoadNativeExpressAds();
    adapter = new RecyclerViewAdapter(this, mRecyclerViewIte

它对我有用。我希望这能解决你的问题。

于 2017-08-10T13:33:59.920 回答