Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有两种视图类型的RecyclerAdapter中的IndexOutOfBoundsException_Java_Android_Arraylist_Android Recyclerview_Indexoutofboundsexception - Fatal编程技术网

Java 具有两种视图类型的RecyclerAdapter中的IndexOutOfBoundsException

Java 具有两种视图类型的RecyclerAdapter中的IndexOutOfBoundsException,java,android,arraylist,android-recyclerview,indexoutofboundsexception,Java,Android,Arraylist,Android Recyclerview,Indexoutofboundsexception,您会注意到,在下面的feedItems.adAll(adItems)行下面,我注释掉了几行代码。无论何时发生这种异常,我都可以证明feedItems列表是空的 这是我的回收适配器: public class FeedRecyclerAdapter extends LoadingRowRecyclerAdapter { private static final int VIEW_TYPE_FEED = 1; private static final int VIEW_TYPE_A

您会注意到,在下面的
feedItems.adAll(adItems)
行下面,我注释掉了几行代码。无论何时发生这种异常,我都可以证明feedItems列表是空的

这是我的回收适配器:

public class FeedRecyclerAdapter extends LoadingRowRecyclerAdapter {

    private static final int VIEW_TYPE_FEED = 1;
    private static final int VIEW_TYPE_AD = 2;

    private final Context context;
    private final List<Feed> feedItems;
    private final ImageLoader feedItemImageLoader;
    private FeedItemClickListener feedItemClickListener;
    private boolean isLongPressed = false;

    public FeedRecyclerAdapter(Context context, List<Feed> feedItems, ImageLoader feedItemImageLoader, List<Feed> adItems) {
        this.context = context;
        this.feedItems = feedItems;
        this.feedItemImageLoader = feedItemImageLoader;
        feedItems.addAll(adItems);
//        if (adItems.isEmpty()) {
//            Log.d(getClass().toString(), "IndexOutOfBoundsException!");
//        }
    }

    // Differentiate between feedItem views and nativeAds
    @Override
    public int getItemViewType(int position) {
        int viewType = 1;
        if ((position % 9 == 0) && position != 1) viewType = 2;
        return viewType;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType) {
            case VIEW_TYPE_FEED:
                return new FeedViewHolder(new FeedItemView(context));
            case VIEW_TYPE_AD:
                return new AdViewHolder(new AdItemView(context));
        }
        return super.onCreateViewHolder(parent, viewType);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
        if (getItemViewType(position) == VIEW_TYPE_FEED) {
            bindFeedItemView((FeedViewHolder) viewHolder, position);
        } else {
            bindAdItemView((AdViewHolder) viewHolder);
        }
    }

    @Override
    protected int getContentDataSize() {
        return feedItems.size();
    }

    @Override
    protected int getViewType(int position) {
        if (position == 1) {
            return VIEW_TYPE_FEED;
        } else {
            return VIEW_TYPE_AD;
        }
    }

    class FeedViewHolder extends RecyclerView.ViewHolder {

        FeedItemView feedItemView;

        public FeedViewHolder(FeedItemView view) {
            super(view);
            this.feedItemView = view;
        }

    }

    class AdViewHolder extends RecyclerView.ViewHolder {

        AdItemView adItemView;

        public AdViewHolder(AdItemView view) {
            super(view);
            this.adItemView = view;
        }

    }

    private NativeAd nativeAd;
    private AdChoicesView adChoicesView;

    private void showNativeAd(AdViewHolder viewHolder){
        AdSettings.addTestDevice("STRING");
        nativeAd = new NativeAd(context, "STRING");
        nativeAd.setAdListener(new AdListener() {

            @Override
            public void onError(Ad ad, AdError adError) {

            }

            @Override
            public void onAdLoaded(Ad ad) {

                final AdItemView adItemView = viewHolder.adItemView;

                // Setting the Text
                adItemView.nativeAdSocialContext.setText(nativeAd.getAdSocialContext());
                adItemView.nativeAdCallToAction.setText(nativeAd.getAdCallToAction());
                adItemView.nativeAdTitle.setText(nativeAd.getAdTitle());
                adItemView.nativeAdBody.setText(nativeAd.getAdBody());

                // Downloading and setting the ad icon
                NativeAd.Image adIcon = nativeAd.getAdIcon();
                NativeAd.downloadAndDisplayImage(adIcon, adItemView.nativeAdIcon);

                // Download and setting the cover image
                /*NativeAd.Image adCoverImage = nativeAd.getAdCoverImage();*/
                adItemView.nativeAdMedia.setNativeAd(nativeAd);

                // Add adChoices icon
                if (adChoicesView == null) {
                    adChoicesView = new AdChoicesView(context, nativeAd, true);
                    adItemView.addView(adChoicesView, 0);
                }

                nativeAd.registerViewForInteraction(adItemView);

            }

            @Override
            public void onAdClicked(Ad ad) {

            }
        });

        nativeAd.loadAd();
    }

    // For Ad Objects
    private void bindAdItemView(AdViewHolder viewHolder) {

        showNativeAd(viewHolder);

    }

    // For Feed Objects
    private void bindFeedItemView(FeedViewHolder viewHolder, int position) {
        final FeedItemView feedItemView = viewHolder.feedItemView;
        final Feed feedDesign = feedItems.get(position);

        // TODO we can probably conditionally show or hide these based on the type of feed item, same as in FeedActivitySingle
        feedItemView.showOrHideEditButton(true);
        feedItemView.showOrHideBuyButton(false);
        feedItemView.showOrHideFlipButton(false);
        feedItemView.showOrHidePriceText(false);

        // Set the results into TextViews
        feedItemView.setProductPriceText(String.valueOf(feedDesign.getDesign().getPrice()));
        feedItemView.setDownloadsText(String.valueOf(feedDesign.getDesign().getDownloadCount()));
        feedItemView.setLikesText(String.valueOf(feedDesign.getDesign().getLikesCount()));
        feedItemView.setUsernameText(feedDesign.getDesign().getAuthor().getUsername());
        feedItemView.setTimestampText(feedDesign.getTimestampText());
        feedItemView.getSaveImage().setImageResource(feedDesign.isInPersonalGallery() ? R.drawable.ic_action_saved : R.drawable.ic_not_saved);
        feedItemView.getLikeImage().setImageResource(feedDesign.isLiked() ? R.drawable.ic_action_like_feed_full : R.drawable.ic_action_like_feed);

        feedItemView.getTrashImage().setVisibility(ParseHelper.isCurrentUser(feedDesign.getDesign().getAuthor().getObjectId()) ? View.VISIBLE : View.GONE);
        feedItemView.getFeedSocialShareImage().setVisibility(View.VISIBLE);

        feedItemImageLoader.DisplayImage(feedDesign.getDesign().getCompressedImage().getUrl(), feedItemView.getImage(), feedItemView.getProgressBar());

        if(feedDesign.getDesign().getAuthor().getProfilePicture() != null) {
            feedItemImageLoader.DisplayImage(feedDesign.getDesign().getAuthor().getProfilePicture().getUrl(), feedItemView.getProfilePicture(), null); // TODO should this use profilePictureFileCache?
        } else {
            viewHolder.feedItemView.getProfilePicture().setImageResource(R.drawable.ic_anonymous);
        }

        SetCommentViews(feedItemView, feedDesign.getComments());
        SetClickListeners(feedItemView, feedDesign);
    }
编辑

当项目的位置是5,而不是10或15,或者我尝试过的任何其他数字时,异常停止发生:

// Differentiate between feedItem views and nativeAds
@Override
public int getItemViewType(int position) {
    int viewType = 1;
    if ((position % 5 == 0) && position != 1) viewType = 2;
    return viewType;
}
我不明白为什么会这样

java.lang.IndexOutOfBoundsException:索引5无效,大小为5

例如,您有一个包含5项的数组,并且您请求第6项,它将崩溃并抛出“IndexOutOfBoundsException”错误,因为数组小于您请求的数组


->

有道理,我只是想知道如何在我的上下文中解决这个问题。我不能完全理解你的代码,但想想它崩溃的时候,那一刻发生了什么,你问了什么,它做了什么……我不知道这有多大帮助-在哪一行它崩溃了?当adItems.isEmpty()为真时它崩溃了,这意味着当数组中没有对象时,它应该处于加载过程中。请尝试以下操作:如果(!adItems.isEmpty(){feedItems.addAll(adItems);}仍然使用
java.lang.IndexOutOfBoundsException产生相同的崩溃:无效索引5,大小为5
。如果我设置
If((位置%5==0)和&position!=1)viewType=2
在我的getItemViewType方法中,我从未得到过足够奇怪的崩溃。
// Differentiate between feedItem views and nativeAds
@Override
public int getItemViewType(int position) {
    int viewType = 1;
    if ((position % 5 == 0) && position != 1) viewType = 2;
    return viewType;
}