Recyclerview с несколькими типами просмотра? - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть приложение с тремя несколькими видами в адаптере, но я вижу только рекламу, а другой вид, третий вид не отображается. Как я могу это исправить?

Показывает только AdsViewholder и Menu_ViewHolder, но третье представление (Thread ViewHolder) не показывает ...

Код моего адаптера:

publi c Класс RealAdsAdapter расширяет RecyclerView.Adapter {

private Context mContext;
private List<Object> mRecyclerViewItems;

private static final int MENU_ITEM_VIEW_TYPE = 0;
private static final int UNIFIED_NATIVE_AD_VIEW_TYPE = 1;
private static final int THREAD_ITEM_VIEW_TYPE = 2;

private FirebaseUser firebaseUser;

public RealAdsAdapter(Context context, List<Object> recyclerViewItems){
    this.mContext = context;
    this.mRecyclerViewItems = recyclerViewItems;
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
    switch (viewType) {
        case UNIFIED_NATIVE_AD_VIEW_TYPE:
            View unifiedNativeLayoutView = LayoutInflater.from(
                    viewGroup.getContext()).inflate(R.layout.ad_unified,
                    viewGroup, false);
            return new UnifiedNativeAdViewHolder(unifiedNativeLayoutView);

        case THREAD_ITEM_VIEW_TYPE:
            View threadItemLayoutView = LayoutInflater.from(viewGroup.getContext())
                    .inflate(R.layout.thread_item, viewGroup, false);
            return new ThreadItemViewHolder(threadItemLayoutView);

        case MENU_ITEM_VIEW_TYPE:

        default:
            View menuItemLayoutView = LayoutInflater.from(viewGroup.getContext())
                    .inflate(R.layout.post_item, viewGroup, false);
            return new MenuItemViewHolder(menuItemLayoutView);
    }
}

@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position) {

    int viewType = getItemViewType(position);

    switch (viewType) {
        case UNIFIED_NATIVE_AD_VIEW_TYPE:
            UnifiedNativeAd nativeAd = (UnifiedNativeAd) mRecyclerViewItems.get(position);
            populateNativeAdView(nativeAd, ((UnifiedNativeAdViewHolder)holder).getAdView());
            break;

        case THREAD_ITEM_VIEW_TYPE:

            firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
            final ThreadItemViewHolder threadItemViewHolder = (ThreadItemViewHolder) holder;
            final Post postThread = (Post)mRecyclerViewItems.get(position);


            .............
            break;

        case MENU_ITEM_VIEW_TYPE:
            // fall through
        default:

            firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
            final MenuItemViewHolder menuItemViewHolder = (MenuItemViewHolder)holder;
            final Post post = (Post)mRecyclerViewItems.get(position);


            .......
}




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

@Override
public int getItemViewType(int position) {

    Object recyclerViewItem = mRecyclerViewItems.get(position);
    if (recyclerViewItem instanceof UnifiedNativeAd) {
        return UNIFIED_NATIVE_AD_VIEW_TYPE;
    } else if (recyclerViewItem instanceof ThreadItemViewHolder) {
        return THREAD_ITEM_VIEW_TYPE;
    }
    return MENU_ITEM_VIEW_TYPE;
}


public class MenuItemViewHolder extends RecyclerView.ViewHolder {
    public ImageView upload_image_profile.........

    public MenuItemViewHolder(@NonNull View itemView) {
        super(itemView);

        upload_image_profile = itemView.findViewById(R.id.upload_image_profile);........

    }
}

public class ThreadItemViewHolder extends RecyclerView.ViewHolder {
    public ImageView thread_image_profile.......

    public ThreadItemViewHolder(@NonNull View itemView) {
        super(itemView);

        thread_image_profile = itemView.findViewById(R.id.thread_image_profile);......

    }
}

private void populateNativeAdView(UnifiedNativeAd nativeAd, UnifiedNativeAdView adView) {
    // Some assets are guaranteed to be in every UnifiedNativeAd.
    ........

1 Ответ

0 голосов
/ 18 апреля 2020

Я думаю, что проблема в методе oncreateviewholder, вы должны знать, что значение default предназначено для запуска, когда не выполняется ни одно условие. Поэтому удалите значение по умолчанию:

Удалите это:

    default:
        View menuItemLayoutView = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.post_item, viewGroup, false);
        return new MenuItemViewHolder(menuItemLayoutView);

используйте только это:

    case UNIFIED_NATIVE_AD_VIEW_TYPE:
        View unifiedNativeLayoutView = LayoutInflater.from(
                viewGroup.getContext()).inflate(R.layout.ad_unified,
                viewGroup, false);
        return new UnifiedNativeAdViewHolder(unifiedNativeLayoutView);

    case THREAD_ITEM_VIEW_TYPE:
        View threadItemLayoutView = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.thread_item, viewGroup, false);
        return new ThreadItemViewHolder(threadItemLayoutView);


    case MENU_ITEM_VIEW_TYPE:
        View menuItemLayoutView = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.post_item, viewGroup, false);
        return new MenuItemViewHolder(menuItemLayoutView);

То же самое для метода onBindViewHolder, делайте то, что я вам сказал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...