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;
}