我有一个recycler视图,在其中我使用rss阅读器获取新闻提要,在recycler视图的索引2中,我想放置一个广告视图,但不知道如何放置它。请立即为我提供有关这个问题的解决方案。
回收站视图代码:

  private Context mContext;
private View main;
private RecyclerView m_newsList;
private RecyclerView.LayoutManager m_layoutManager;
private CNewsAdapter m_newsAdapter;
String tagname;
ArrayList<CNewsModel> feeds = new ArrayList<CNewsModel>();
private RelativeLayout m_mainLayout;
private String URL = "http://gadgets.ndtv.com/rss/feeds";
private LinearLayout m_noInternetWarning;
private ImageButton m_BtnRetry;
private ProgressBar m_loadingProgress;
CNewsModel feed;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    main = inflater.inflate(R.layout.reward_news_activity, container, false);
    mContext = getActivity();
    m_mainLayout = (RelativeLayout) main.findViewById(R.id.news_main_layout);
    findViewById();
    readRss();
    return main;
}

/*Loading news through Rss reader*/
private void readRss() {
    if (RewardUtil.isConnected(mContext)) {
        new LoadFeed().execute(URL);
    } else {
        m_noInternetWarning.setVisibility(View.VISIBLE);
        m_loadingProgress.setVisibility(View.GONE);
    }
}

private void findViewById() {
    m_BtnRetry = (ImageButton) main.findViewById(R.id.news_btn_retry);
    m_BtnRetry.setOnClickListener(this);
    m_noInternetWarning = (LinearLayout) main.findViewById(R.id.news_no_internet_warning);
    m_loadingProgress = (ProgressBar) main.findViewById(R.id.news_loadingProgress);

    m_newsList = (RecyclerView) main.findViewById(R.id.news_list);
    m_layoutManager = new LinearLayoutManager(mContext);
    m_newsList.setLayoutManager(m_layoutManager);
}

@Override
public void onClick(View v) {
    if (v == m_BtnRetry) {
        if (RewardUtil.isConnected(mContext)) {
            m_noInternetWarning.setVisibility(View.GONE);
            m_loadingProgress.setVisibility(View.VISIBLE);
            new LoadFeed().execute(URL);
        } else {
            CSnackBar.showSnackBarError(m_mainLayout, getResources().getString(R.string.no_internet_connection_warning));
        }
    }
}

/*Loading news Throudgh Rss reader*/
private class LoadFeed extends AsyncTask<String, Void, ArrayList<CNewsModel>> {
    @Override
    protected ArrayList<CNewsModel> doInBackground(String... arg0) {
        XmlPullParserFactory factory = null;
        XmlPullParser parser = null;
        try {
            factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);
            parser = factory.newPullParser();
            DefaultHttpClient client = new DefaultHttpClient();
            HttpGet method = new HttpGet(new URI(arg0[0]));
            HttpResponse res = client.execute(method);
            InputStream is = res.getEntity().getContent();
            parser.setInput(new InputStreamReader(is));
            int eventType = parser.getEventType();
            feed = new CNewsModel();
            String text = "";
            while (eventType != XmlPullParser.END_DOCUMENT) {
                tagname = parser.getName();
                //Log.d(tagname, "tagname");
                switch (eventType) {
                    case XmlPullParser.START_TAG:
                        if (tagname.equalsIgnoreCase("item")) {
                            feed = new CNewsModel();
                        }
                        break;
                    case XmlPullParser.TEXT:
                        text = parser.getText();
                        break;
                    case XmlPullParser.END_TAG:
                        if (tagname.equalsIgnoreCase("item")) {
                            feeds.add(feed);
                        } else if (tagname.equalsIgnoreCase("title")) {
                            feed.setTitle(text);
                        } else if (tagname.equalsIgnoreCase("description")) {
                            feed.setDesc(text);
                        } else if (tagname.equalsIgnoreCase("link")) {
                            feed.setLinks(text);
                        } else if (tagname.equalsIgnoreCase("storyimage")) {
                            feed.setImage_list(text);
                        } else if (tagname.equalsIgnoreCase("pubDate")) {
                            feed.setPub_date(text);
                        }
                        break;
                    default:
                        break;
                }
                eventType = parser.next();
            }
        } catch (XmlPullParserException | IOException | URISyntaxException e) {
            e.printStackTrace();
        }
        return feeds;
    }

    @Override
    protected void onPostExecute(final ArrayList<CNewsModel> cNewsModels) {
        super.onPostExecute(cNewsModels);
        m_loadingProgress.setVisibility(View.GONE);
        m_newsAdapter = new CNewsAdapter(mContext, cNewsModels, new RecyclerViewClickListener() {
            @Override
            public void recyclerViewListClicked(View v, int position) {
                Toast.makeText(mContext, "Clicked::" + position, Toast.LENGTH_LONG).show();
                Intent i = new Intent(mContext, CNewsView.class);
                i.putExtra("Link", cNewsModels.get(position).getLinks());
                mContext.startActivity(i);
            }
        });
        m_newsList.setAdapter(m_newsAdapter);
    }
}

}
和适配器代码
  private static final String TAG = CNewsAdapter.class.getSimpleName();
private Context mContext;
private ArrayList<CNewsModel> models;
private static RecyclerViewClickListener itemListener;

public CNewsAdapter(Context context, ArrayList<CNewsModel> mList, RecyclerViewClickListener itemListener) {
    this.mContext = context;
    this.models = mList;
    this.itemListener = itemListener;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == 2) {
        View adView = LayoutInflater.from(parent.getContext()).inflate(R.layout.ad, parent, false);
        return new AdsHolder(adView);
    } else {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.rewards_news_card, parent, false);
        return new ItemHolder(itemView);
    }
}

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
    CNewsModel pm = models.get(holder.getAdapterPosition());
    if (holder instanceof AdsHolder) {
        final AdsHolder adsHolder = (AdsHolder) holder;
        adsHolder.oNativeExpressAdview.setText("This is AdView");
    } else if (holder instanceof ItemHolder) {
        final ItemHolder itemHolder = (ItemHolder) holder;
        itemHolder.m_newsTitle.setText(pm.getTitle());
        itemHolder.m_newsTime.setText(pm.getPub_date());
        itemHolder.m_newsHeadline.setText(pm.getDesc());
        Picasso.with(mContext).load(pm.getImage_list()).into(itemHolder.m_newsImage, new Callback() {
            @Override
            public void onSuccess() {
                Log.d(TAG, "OnSuccess Called::");
            }

            @Override
            public void onError() {
                Log.d(TAG, "OnError Called::");

            }
        });

    }

}

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

@Override
public int getItemViewType(int position) {
    if (position == 2) {
        return 1;
    } else {
        return 2;
    }
}

public class ViewHolder extends RecyclerView.ViewHolder {
    public ViewHolder(View itemView) {
        super(itemView);
    }
}

private class AdsHolder extends ViewHolder {
    private TextView oNativeExpressAdview;

    public AdsHolder(View adView) {
        super(adView);
        oNativeExpressAdview = (TextView) adView.findViewById(R.id.adView);
    }
}

private class ItemHolder extends ViewHolder implements View.OnClickListener {
    private TextView m_newsTitle, m_newsTime, m_newsHeadline;
    private ImageView m_newsImage;

    public ItemHolder(View itemView) {
        super(itemView);
        m_newsTitle = (TextView) itemView.findViewById(R.id.tv_news_header);
        m_newsTime = (TextView) itemView.findViewById(R.id.tv_news_time);
        m_newsHeadline = (TextView) itemView.findViewById(R.id.tv_news_headline);
        m_newsImage = (ImageView) itemView.findViewById(R.id.iv_news_image);
        itemView.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        itemListener.recyclerViewListClicked(v, this.getLayoutPosition());
    }
}

}

最佳答案

create one layout which holds ad after that in adapter add

      @Override
            public int getItemViewType(int position) {
                switch (position){
                    case 0:
                        return 1;
                    case 1:
                        return 2;

                    default:
                        return 0;
                }
            }


      @Override
            public RecyclerAdapter.CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

                switch (viewType) {
                    case 1:
                    /*your main item*/
                        View viewONE = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_item, parent, false);

                        RecyclerAdapter.CustomViewHolder rowONE = new RecyclerAdapter.CustomViewHolder(viewONE);
                        return rowONE;

                    case 2:
                    /** your ad layout*/
                        View viewTWO = LayoutInflater.from(parent.getContext()).inflate(R.layout.ad_layout, parent, false);

                        RecyclerAdapter.CustomViewHolder rowTWO = new RecyclerAdapter.CustomViewHolder(viewTWO);
                        return rowTWO;
                }
                return null;
            }


in onBind
  @Override
        public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, final int i) {
            switch (viewHolder.getItemViewType()) {
                case 1:
                    ItemHolder vh1 = (ItemHolder ) viewHolder;
                    configureViewHolder1(vh1, i);
                    break;

                case 2:
                    AdsHolder  vh2 = (AdsHolder ) viewHolder;
                    configureViewHolder2(vh2, i);
                    break;
            }
        }

    >    private void configureViewHolder1(final LoadingVH vh1, int
    > position) {
    >          //change your item data here    }
    >
    >
    >  private void configureViewHolder2(final ViewHolder2 vh1, int
    > position) {
    >             // change ad data here
    >                    }

10-08 04:47