Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.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 Android RecyclerAdapter中的ClassCastException_Java_Android_Classcastexception_Android Recyclerview - Fatal编程技术网

Java Android RecyclerAdapter中的ClassCastException

Java Android RecyclerAdapter中的ClassCastException,java,android,classcastexception,android-recyclerview,Java,Android,Classcastexception,Android Recyclerview,我很难理解为什么我在我的RecyclerAdapter课程中遇到ClassCastException。我将其设置为接受两种不同类型的视图,一种用于常规提要项目,另一种用于本地广告。出什么事了 在我的主要活动中,我调用构造函数如下: feedItems = new ArrayList<>(); List<Feed> adItems = new ArrayList<>(); recyclerView = (RecyclerView) findViewById(R.

我很难理解为什么我在我的RecyclerAdapter课程中遇到ClassCastException。我将其设置为接受两种不同类型的视图,一种用于常规提要项目,另一种用于本地广告。出什么事了

在我的主要活动中,我调用构造函数如下:

feedItems = new ArrayList<>();
List<Feed> adItems = new ArrayList<>();
recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
marketFeedRecyclerAdapter = new MarketFeedRecyclerAdapter(this, feedItems, new ImageLoader(new FeedItemFileCache(this)), adItems);
bindAdItemView((AdViewHolder) viewHolder);
public class MarketFeedRecyclerAdapter extends LoadingRowRecyclerAdapter {

    private static final int VIEW_TYPE_MARKET_FEED = 0;
    private static final int VIEW_TYPE_AD = 1;

    private final Context context;
    private final List<Feed> feedItems;
    private final ImageLoader feedItemImageLoader;
    private FeedItemClickListener feedItemClickListener;

    private boolean isLongPressed = false;
    public MarketFeedRecyclerAdapter(Context context, List<Feed> feedItems, ImageLoader feedItemImageLoader, List<Feed> adItems) {
        this.context = context;
        this.feedItems = feedItems;
        this.feedItemImageLoader = feedItemImageLoader;
        this.feedItems.addAll(adItems);
    }

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

    // Differentiate between feedItem views and nativeAds
    @Override
    public int getViewType(int position) {
        int viewType = VIEW_TYPE_MARKET_FEED;
        if ((position % 25 == 0)) {
            viewType = VIEW_TYPE_AD;
        }
        return viewType;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
        if (getViewType(position) == VIEW_TYPE_MARKET_FEED) {
                bindMarketFeedItemView((MarketFeedViewHolder) viewHolder, position - position / 6);
        }  else {
            bindAdItemView((AdViewHolder) viewHolder);
        }
    }

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

        showNativeAd(viewHolder);

    }

    private void bindMarketFeedItemView(MarketFeedViewHolder 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(false);
        feedItemView.showOrHideBuyButton(true);
        feedItemView.showOrHideFlipButton(feedDesign.getDesign().getCompressedBackImage() != null);
        feedItemView.showOrHidePriceText(true);

        // 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);

        switch(feedDesign.getDisplayedSide()) {
            case FRONT:
                feedItemImageLoader.DisplayImage(feedDesign.getDesign().getCompressedImage().getUrl(), feedItemView.getImage(), feedItemView.getProgressBar());
                break;
            case BACK:
                feedItemImageLoader.DisplayImage(feedDesign.getDesign().getCompressedBackImage().getUrl(), feedItemView.getImage(), feedItemView.getProgressBar());
                break;
        }

        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, position);
    }

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

class MarketFeedViewHolder extends RecyclerView.ViewHolder {

    FeedItemView feedItemView;

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

class AdViewHolder extends RecyclerView.ViewHolder {

    MarketFeedAdItemView adItemView;

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

}

    private NativeAd nativeAd;
    private AdChoicesView adChoicesView;

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

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

            }

            @Override
            public void onAdLoaded(Ad ad) {

                final MarketFeedAdItemView 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();
    }
}
public abstract class LoadingRowRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    public static final int ROW_VIEW_TYPE_LOADING = 72398; // obscure number
    private boolean mContainsLoadingRow;

    protected abstract int getContentDataSize();

    protected abstract int getViewType(int position);

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType) {
            case ROW_VIEW_TYPE_LOADING:
                return new LoadingViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.loading_row, parent, false));
        }

        throw new IllegalArgumentException("viewType is not ROW_VIEW_TYPE_LOADING. You must handle all other values of viewType (defined by getViewType) before calling super.");
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        // empty
    }

    @Override
    public final int getItemCount() {
        return mContainsLoadingRow ? (getContentDataSize() + 1) : getContentDataSize();
    }

    @Override
    public int getItemViewType(int position) {
        return (position == getContentDataSize()) ? ROW_VIEW_TYPE_LOADING : getViewType(position);
    }

    /**
     * Sets a boolean which is used by getItemCount and in turn getItemViewType to determine which view type the row should be (loading view vs. other view).
     * Should only be called when there is more results to load in an upcoming api request (determined by calling fragment).
     */
    public void toggleLoadingRowOn() {
        mContainsLoadingRow = true;
    }

    /**
     * Checks to see if a loading row exists by checking an instance boolean and removes the row / clears the boolean.
     * This helps to 'replace' a loading row with a different row.
     */
    public void toggleLoadingRowOff() {
        if (mContainsLoadingRow) {
            mContainsLoadingRow = false;

            // removes the loading row explicitly instead of allowing it to be 'pushed' down when new user suggestion rows are added.
            // this is only required to maintain consistency with the rest of the app.
            int position = getContentDataSize();
            if (position >= 0) {
                notifyItemRemoved(position);
            }
        }
    }

    protected class LoadingViewHolder extends RecyclerView.ViewHolder {

        public LoadingViewHolder(View v) {
            super(v);
        }
    }
}
public abstract class EndlessRecyclerOnScrollListener extends RecyclerView.OnScrollListener {

    private static final int VISIBLE_THRESHOLD = 5; // The minimum amount of items to have below your current scroll position before loading more
    private LinearLayoutManager mLinearLayoutManager;

    public abstract void onLoadMore();

    public EndlessRecyclerOnScrollListener(LinearLayoutManager linearLayoutManager) {
        this.mLinearLayoutManager = linearLayoutManager;
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        int totalItemCount = mLinearLayoutManager.getItemCount();
        int firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();
        int visibleItemCount = recyclerView.getChildCount();

        int lastItemVisible = firstVisibleItem + visibleItemCount;

        // once the last visible item is within VISIBLE_THRESHOLD from the bottom, we want to load more
        if ((totalItemCount - lastItemVisible) <= VISIBLE_THRESHOLD) {
            onLoadMore();
        }
    }
}
我的堆栈跟踪:

feedItems = new ArrayList<>();
List<Feed> adItems = new ArrayList<>();
recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
marketFeedRecyclerAdapter = new MarketFeedRecyclerAdapter(this, feedItems, new ImageLoader(new FeedItemFileCache(this)), adItems);
bindAdItemView((AdViewHolder) viewHolder);
public class MarketFeedRecyclerAdapter extends LoadingRowRecyclerAdapter {

    private static final int VIEW_TYPE_MARKET_FEED = 0;
    private static final int VIEW_TYPE_AD = 1;

    private final Context context;
    private final List<Feed> feedItems;
    private final ImageLoader feedItemImageLoader;
    private FeedItemClickListener feedItemClickListener;

    private boolean isLongPressed = false;
    public MarketFeedRecyclerAdapter(Context context, List<Feed> feedItems, ImageLoader feedItemImageLoader, List<Feed> adItems) {
        this.context = context;
        this.feedItems = feedItems;
        this.feedItemImageLoader = feedItemImageLoader;
        this.feedItems.addAll(adItems);
    }

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

    // Differentiate between feedItem views and nativeAds
    @Override
    public int getViewType(int position) {
        int viewType = VIEW_TYPE_MARKET_FEED;
        if ((position % 25 == 0)) {
            viewType = VIEW_TYPE_AD;
        }
        return viewType;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
        if (getViewType(position) == VIEW_TYPE_MARKET_FEED) {
                bindMarketFeedItemView((MarketFeedViewHolder) viewHolder, position - position / 6);
        }  else {
            bindAdItemView((AdViewHolder) viewHolder);
        }
    }

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

        showNativeAd(viewHolder);

    }

    private void bindMarketFeedItemView(MarketFeedViewHolder 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(false);
        feedItemView.showOrHideBuyButton(true);
        feedItemView.showOrHideFlipButton(feedDesign.getDesign().getCompressedBackImage() != null);
        feedItemView.showOrHidePriceText(true);

        // 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);

        switch(feedDesign.getDisplayedSide()) {
            case FRONT:
                feedItemImageLoader.DisplayImage(feedDesign.getDesign().getCompressedImage().getUrl(), feedItemView.getImage(), feedItemView.getProgressBar());
                break;
            case BACK:
                feedItemImageLoader.DisplayImage(feedDesign.getDesign().getCompressedBackImage().getUrl(), feedItemView.getImage(), feedItemView.getProgressBar());
                break;
        }

        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, position);
    }

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

class MarketFeedViewHolder extends RecyclerView.ViewHolder {

    FeedItemView feedItemView;

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

class AdViewHolder extends RecyclerView.ViewHolder {

    MarketFeedAdItemView adItemView;

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

}

    private NativeAd nativeAd;
    private AdChoicesView adChoicesView;

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

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

            }

            @Override
            public void onAdLoaded(Ad ad) {

                final MarketFeedAdItemView 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();
    }
}
public abstract class LoadingRowRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    public static final int ROW_VIEW_TYPE_LOADING = 72398; // obscure number
    private boolean mContainsLoadingRow;

    protected abstract int getContentDataSize();

    protected abstract int getViewType(int position);

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType) {
            case ROW_VIEW_TYPE_LOADING:
                return new LoadingViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.loading_row, parent, false));
        }

        throw new IllegalArgumentException("viewType is not ROW_VIEW_TYPE_LOADING. You must handle all other values of viewType (defined by getViewType) before calling super.");
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        // empty
    }

    @Override
    public final int getItemCount() {
        return mContainsLoadingRow ? (getContentDataSize() + 1) : getContentDataSize();
    }

    @Override
    public int getItemViewType(int position) {
        return (position == getContentDataSize()) ? ROW_VIEW_TYPE_LOADING : getViewType(position);
    }

    /**
     * Sets a boolean which is used by getItemCount and in turn getItemViewType to determine which view type the row should be (loading view vs. other view).
     * Should only be called when there is more results to load in an upcoming api request (determined by calling fragment).
     */
    public void toggleLoadingRowOn() {
        mContainsLoadingRow = true;
    }

    /**
     * Checks to see if a loading row exists by checking an instance boolean and removes the row / clears the boolean.
     * This helps to 'replace' a loading row with a different row.
     */
    public void toggleLoadingRowOff() {
        if (mContainsLoadingRow) {
            mContainsLoadingRow = false;

            // removes the loading row explicitly instead of allowing it to be 'pushed' down when new user suggestion rows are added.
            // this is only required to maintain consistency with the rest of the app.
            int position = getContentDataSize();
            if (position >= 0) {
                notifyItemRemoved(position);
            }
        }
    }

    protected class LoadingViewHolder extends RecyclerView.ViewHolder {

        public LoadingViewHolder(View v) {
            super(v);
        }
    }
}
public abstract class EndlessRecyclerOnScrollListener extends RecyclerView.OnScrollListener {

    private static final int VISIBLE_THRESHOLD = 5; // The minimum amount of items to have below your current scroll position before loading more
    private LinearLayoutManager mLinearLayoutManager;

    public abstract void onLoadMore();

    public EndlessRecyclerOnScrollListener(LinearLayoutManager linearLayoutManager) {
        this.mLinearLayoutManager = linearLayoutManager;
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        int totalItemCount = mLinearLayoutManager.getItemCount();
        int firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();
        int visibleItemCount = recyclerView.getChildCount();

        int lastItemVisible = firstVisibleItem + visibleItemCount;

        // once the last visible item is within VISIBLE_THRESHOLD from the bottom, we want to load more
        if ((totalItemCount - lastItemVisible) <= VISIBLE_THRESHOLD) {
            onLoadMore();
        }
    }
}
以下是我的RecyclerAdapter类:

feedItems = new ArrayList<>();
List<Feed> adItems = new ArrayList<>();
recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
marketFeedRecyclerAdapter = new MarketFeedRecyclerAdapter(this, feedItems, new ImageLoader(new FeedItemFileCache(this)), adItems);
bindAdItemView((AdViewHolder) viewHolder);
public class MarketFeedRecyclerAdapter extends LoadingRowRecyclerAdapter {

    private static final int VIEW_TYPE_MARKET_FEED = 0;
    private static final int VIEW_TYPE_AD = 1;

    private final Context context;
    private final List<Feed> feedItems;
    private final ImageLoader feedItemImageLoader;
    private FeedItemClickListener feedItemClickListener;

    private boolean isLongPressed = false;
    public MarketFeedRecyclerAdapter(Context context, List<Feed> feedItems, ImageLoader feedItemImageLoader, List<Feed> adItems) {
        this.context = context;
        this.feedItems = feedItems;
        this.feedItemImageLoader = feedItemImageLoader;
        this.feedItems.addAll(adItems);
    }

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

    // Differentiate between feedItem views and nativeAds
    @Override
    public int getViewType(int position) {
        int viewType = VIEW_TYPE_MARKET_FEED;
        if ((position % 25 == 0)) {
            viewType = VIEW_TYPE_AD;
        }
        return viewType;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
        if (getViewType(position) == VIEW_TYPE_MARKET_FEED) {
                bindMarketFeedItemView((MarketFeedViewHolder) viewHolder, position - position / 6);
        }  else {
            bindAdItemView((AdViewHolder) viewHolder);
        }
    }

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

        showNativeAd(viewHolder);

    }

    private void bindMarketFeedItemView(MarketFeedViewHolder 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(false);
        feedItemView.showOrHideBuyButton(true);
        feedItemView.showOrHideFlipButton(feedDesign.getDesign().getCompressedBackImage() != null);
        feedItemView.showOrHidePriceText(true);

        // 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);

        switch(feedDesign.getDisplayedSide()) {
            case FRONT:
                feedItemImageLoader.DisplayImage(feedDesign.getDesign().getCompressedImage().getUrl(), feedItemView.getImage(), feedItemView.getProgressBar());
                break;
            case BACK:
                feedItemImageLoader.DisplayImage(feedDesign.getDesign().getCompressedBackImage().getUrl(), feedItemView.getImage(), feedItemView.getProgressBar());
                break;
        }

        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, position);
    }

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

class MarketFeedViewHolder extends RecyclerView.ViewHolder {

    FeedItemView feedItemView;

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

class AdViewHolder extends RecyclerView.ViewHolder {

    MarketFeedAdItemView adItemView;

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

}

    private NativeAd nativeAd;
    private AdChoicesView adChoicesView;

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

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

            }

            @Override
            public void onAdLoaded(Ad ad) {

                final MarketFeedAdItemView 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();
    }
}
public abstract class LoadingRowRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    public static final int ROW_VIEW_TYPE_LOADING = 72398; // obscure number
    private boolean mContainsLoadingRow;

    protected abstract int getContentDataSize();

    protected abstract int getViewType(int position);

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType) {
            case ROW_VIEW_TYPE_LOADING:
                return new LoadingViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.loading_row, parent, false));
        }

        throw new IllegalArgumentException("viewType is not ROW_VIEW_TYPE_LOADING. You must handle all other values of viewType (defined by getViewType) before calling super.");
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        // empty
    }

    @Override
    public final int getItemCount() {
        return mContainsLoadingRow ? (getContentDataSize() + 1) : getContentDataSize();
    }

    @Override
    public int getItemViewType(int position) {
        return (position == getContentDataSize()) ? ROW_VIEW_TYPE_LOADING : getViewType(position);
    }

    /**
     * Sets a boolean which is used by getItemCount and in turn getItemViewType to determine which view type the row should be (loading view vs. other view).
     * Should only be called when there is more results to load in an upcoming api request (determined by calling fragment).
     */
    public void toggleLoadingRowOn() {
        mContainsLoadingRow = true;
    }

    /**
     * Checks to see if a loading row exists by checking an instance boolean and removes the row / clears the boolean.
     * This helps to 'replace' a loading row with a different row.
     */
    public void toggleLoadingRowOff() {
        if (mContainsLoadingRow) {
            mContainsLoadingRow = false;

            // removes the loading row explicitly instead of allowing it to be 'pushed' down when new user suggestion rows are added.
            // this is only required to maintain consistency with the rest of the app.
            int position = getContentDataSize();
            if (position >= 0) {
                notifyItemRemoved(position);
            }
        }
    }

    protected class LoadingViewHolder extends RecyclerView.ViewHolder {

        public LoadingViewHolder(View v) {
            super(v);
        }
    }
}
public abstract class EndlessRecyclerOnScrollListener extends RecyclerView.OnScrollListener {

    private static final int VISIBLE_THRESHOLD = 5; // The minimum amount of items to have below your current scroll position before loading more
    private LinearLayoutManager mLinearLayoutManager;

    public abstract void onLoadMore();

    public EndlessRecyclerOnScrollListener(LinearLayoutManager linearLayoutManager) {
        this.mLinearLayoutManager = linearLayoutManager;
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        int totalItemCount = mLinearLayoutManager.getItemCount();
        int firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();
        int visibleItemCount = recyclerView.getChildCount();

        int lastItemVisible = firstVisibleItem + visibleItemCount;

        // once the last visible item is within VISIBLE_THRESHOLD from the bottom, we want to load more
        if ((totalItemCount - lastItemVisible) <= VISIBLE_THRESHOLD) {
            onLoadMore();
        }
    }
}
公共类MarketFeedRecyclerAdapter扩展了LoadingRowRecyclerAdapter{
私有静态最终整数视图\类型\市场\馈送=0;
私有静态最终int视图类型AD=1;
私人最终语境;
私人最终项目清单;
私有最终ImageLoader feedItemImageLoader;
私有FeedItemClickListener FeedItemClickListener;
私有布尔值isLongPressed=false;
公共市场FeedRecyclerAdapter(上下文上下文、列表feedItems、ImageLoader feedItemImageLoader、列表adItems){
this.context=上下文;
此项。feedItems=feedItems;
this.feedItemImageLoader=feedItemImageLoader;
此.feedItems.addAll(adItems);
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
开关(视图类型){
案例视图\u类型\u市场\u提要:
返回新的MarketFeedViewHolder(新的FeedItemView(上下文));
案例视图\类型\广告:
返回新的AdViewHolder(new MarketFeedAdItemView(上下文));
}
返回super.onCreateViewHolder(父级,viewType);
}
//区分feedItem视图和NativeAD
@凌驾
公共int getViewType(int位置){
int viewType=视图\类型\市场\提要;
如果((位置%25==0)){
视图类型=视图类型广告;
}
返回视图类型;
}
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder ViewHolder,int位置){
if(getViewType(position)=视图类型市场馈送){
bindMarketFeedItemView((MarketFeedViewHolder)viewHolder,位置-位置/6);
}否则{
bindAdItemView((AdViewHolder)视图持有者);
}
}
//对于广告对象
私有void BindItemView(AdViewHolder视图持有者){
showNativeAd(视图持有者);
}
私有void bindMarketFeedItemView(MarketFeedViewHolder视图持有人,内部位置){
最终FeedItemView FeedItemView=viewHolder.FeedItemView;
最终饲料设计=饲料项目。获取(位置);
//TODO我们可能会根据提要项的类型有条件地显示或隐藏这些内容,与FeedActivitySingle中的内容相同
feedItemView.showOrHideEditButton(假);
feedItemView.showOrHideBuyButton(真);
feedItemView.showOrHideFlipButton(feedDesign.getDesign().getCompressedBackImage()!=null);
feedItemView.showOrHidePriceText(true);
//将结果设置为文本视图
feedItemView.setProductPriceText(String.valueOf(feedDesign.getDesign().getPrice());
feedItemView.setDownloadsText(String.valueOf(feedDesign.getDesign().getDownloadCount());
feedItemView.setLikeText(String.valueOf(feedDesign.getDesign().getLikeCount());
feedItemView.setUsernameText(feedDesign.getDesign().getAuthor().getUsername());
setTimestampText(feedDesign.getTimestampText());
feedItemView.getSaveImage().setImageResource(feedDesign.IsInputPersonalGallery()?R.drawable.ic_操作保存:R.drawable.ic_未保存);
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);
开关(feedDesign.getDisplayedSide()){
案件正面:
feedItemImageLoader.DisplayImage(feedDesign.getDesign().getCompressedImage().getUrl(),feedItemView.getImage(),feedItemView.getProgressBar());
打破
案件背景:
feedItemImageLoader.DisplayImage(feedDesign.getDesign().getCompressedBackImage().getUrl(),feedItemView.getImage(),feedItemView.getProgressBar());
打破
}
if(feedDesign.getDesign().getAuthor().getProfilePicture()!=null){
feedItemImageLoader.DisplayImage(feedDesign.getDesign().getAuthor().getProfilePicture().getUrl(),feedItemView.getProfilePicture(),null);//该如何使用profilePictureFileCache?
}否则{
viewHolder.feedItemView.getProfilePicture().setImageResource(R.drawable.ic_匿名);
}
SetCommentView(feedItemView,feedDesign.getComments());
设置ClickListeners(feedItemView、feedDesign、position);
}
@凌驾
受保护的int getContentDataSize(){
返回feedItems.size();
}
类MarketFeedViewHolder扩展了RecyclerView.ViewHolder{
FeedItemView FeedItemView;
公共市场FeedViewHolder(FeedItemView视图){
超级(视图);
this.feedItemView=视图;
}
}
类AdViewHolder扩展了RecyclerView.ViewHolder{
MarketFeedAdItemView adItemView;
公共顾问(MarketFeedAdItemView视图){
超级(视图);
this.adItemView=视图;
}
}
私有的本地的本地的;
私人AdChoiceView AdChoiceView;
私有void showNativeAd(AdViewHolder视图持有者){
AdSettings.addTestDevice(“a6ffb7bec7af13f768f033dbfea042df”);
nativeAd=新的nativeAd(上下文,“846223392142435_1025413774223395”);
nativeAd.setAdListener(新的AdListener(){
@凌驾
公共无效者(广告、广告、广告){
}
@凌驾
已加载的公共无效(Ad){
最终市场反馈Aditemie