Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.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/192.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 在RecyclerView AndroidX中的项目之间添加不同的布局_Java_Android_Android Recyclerview - Fatal编程技术网

Java 在RecyclerView AndroidX中的项目之间添加不同的布局

Java 在RecyclerView AndroidX中的项目之间添加不同的布局,java,android,android-recyclerview,Java,Android,Android Recyclerview,我想在我的recyclerview中的项目之间添加不同的布局,我在第一个布局中有3个项目,然后我在项目编号2中添加第二个布局,所以现在应该有4个项目,(1-FirstLayout)-(2-SecondLayout)-(3FirstLayout)-(4FirstLayout),但我意识到我选择的位置从第二个布局替换为第一个布局,它变成这样(1-FirstLayout)-(2-SecondLayout)-(3FirstLayout) 我不知道如何修理它 这是我的适配器 public class A

我想在我的recyclerview中的项目之间添加不同的布局,我在第一个布局中有3个项目,然后我在项目编号2中添加第二个布局,所以现在应该有4个项目,(1-FirstLayout)-(2-SecondLayout)-(3FirstLayout)-(4FirstLayout),但我意识到我选择的位置从第二个布局替换为第一个布局,它变成这样(1-FirstLayout)-(2-SecondLayout)-(3FirstLayout) 我不知道如何修理它

这是我的适配器

public class AdapterGameReview extends RecyclerView.Adapter{

public static final int TYPE_ITEM = 1;
public static final int TYPE_TOPREVIEWER = 2;
public static final int TYPE_ADSBANNER = 3;

private boolean mWithTopReviewer = true;
private boolean mWithAdsBanner = false;

private Context mContext;
private ArrayList<ModelGameReview> modelGameReviews;

private RecyclerViewClickListener mListener;

public AdapterGameReview(Context mContext, ArrayList<ModelGameReview> modelGameReviews, RecyclerViewClickListener mListener) {
    this.mContext = mContext;
    this.modelGameReviews = modelGameReviews;
    this.mListener = mListener;
}

//Container
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {

    View v = null;

    if (viewType == TYPE_TOPREVIEWER) {
        v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_gamereviewtopreviewer, null);
        return new GameReviewTopReviewerViewHolder(v);
    } else if (viewType == TYPE_ADSBANNER) {
        v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_adsbannerdummy, null);
        return new GameReviewAdsBannerViewHolder(v);
    } else {
        v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_gamereview, null);
        return new GameReviewViewHolder(v, mListener);
    }

}

//Fill Container with Model Setter Getter
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {

    if (holder instanceof AdapterGameReview.GameReviewTopReviewerViewHolder) {
        AdapterGameReview.GameReviewTopReviewerViewHolder gameReviewTopReviewerViewHolder = (AdapterGameReview.GameReviewTopReviewerViewHolder) holder;
        /*gameReviewTopReviewerViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });*/

    }else if (holder instanceof AdapterGameReview.GameReviewAdsBannerViewHolder) {
        AdapterFollowSavedGameReviewList.ShowmoreViewHolder showmoreViewHolder = (AdapterFollowSavedGameReviewList.ShowmoreViewHolder) holder;


    } else {

        final GameReviewViewHolder GameReviewViewHolder = (GameReviewViewHolder) holder;
        final ModelGameReview modelGameReviewX = modelGameReviews.get(position);

        RequestOptions requestOptions = new RequestOptions();
        requestOptions.placeholder(R.mipmap.ic_launcher);
        requestOptions.error(R.drawable.bug);
        requestOptions.diskCacheStrategy(DiskCacheStrategy.ALL);
        requestOptions.centerCrop();

        SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = null;
        try {
            date = inputFormat.parse(modelGameReviewX.getGamedate());
        } catch (ParseException e) {
            e.printStackTrace();
        }
        CharSequence niceDateStr = DateUtils.getRelativeTimeSpanString(date.getTime(), Calendar.getInstance().getTimeInMillis(), DateUtils.MINUTE_IN_MILLIS);
        //Set
        GameReviewViewHolder.TVGameDate.setText(niceDateStr);
        GameReviewViewHolder.TVGameTitle.setText(modelGameReviewX.getGametitle());
        GameReviewViewHolder.TVGameDescription.setText(modelGameReviewX.getGamedescription());
        Glide.with(mContext).load(modelGameReviewX.getGameimage())
                .apply(requestOptions)
                .listener(new RequestListener<Drawable>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                        GameReviewViewHolder.ProgressLoadPhoto.setVisibility(View.GONE);
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                        GameReviewViewHolder.ProgressLoadPhoto.setVisibility(View.GONE);
                        return false;
                    }
                })
                .transition(DrawableTransitionOptions.withCrossFade())
                .into(GameReviewViewHolder.IMGGameImage);

        GameReviewViewHolder.TVSeenCounter.setText(String.valueOf(modelGameReviewX.getSeencounter()));
        GameReviewViewHolder.TVCommentCounter.setText(String.valueOf(modelGameReviewX.getCommentcounter()));
        GameReviewViewHolder.TVLikeCounter.setText(String.valueOf(modelGameReviewX.getLikecounter()));

        if (modelGameReviewX.getIscomment() == 0) {
            GameReviewViewHolder.IMGCommentView.setImageResource(R.drawable.comment_off);
        } else if (modelGameReviewX.getIscomment() == 1) {
            GameReviewViewHolder.IMGCommentView.setImageResource(R.drawable.comment_on);
        }

        if (modelGameReviewX.getIslike() == 0) {
            GameReviewViewHolder.IMGLikeView.setImageResource(R.drawable.heart_off);
        } else if (modelGameReviewX.getIslike() == 1) {
            GameReviewViewHolder.IMGLikeView.setImageResource(R.drawable.heart_on);
        }

        if (modelGameReviewX.getIsbookmark() == 0) {
            GameReviewViewHolder.IMGBookmarkView.setImageResource(R.drawable.saved_off);
            GameReviewViewHolder.IMGBookmarkView.setVisibility(View.GONE);
        } else if (modelGameReviewX.getIsbookmark() == 1) {
            GameReviewViewHolder.IMGBookmarkView.setImageResource(R.drawable.saved_on);
        }

        GameReviewViewHolder.TVReviewer.setText(modelGameReviewX.getReviewer());
    }

}

@Override
public int getItemCount() {
    int itemCount = 0;
    if(mWithTopReviewer == true){
        itemCount++;
    }
        itemCount = modelGameReviews.size();

    return itemCount;
}

//TYPE_ITEM
public class GameReviewViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    TextView TVGameDate;
    TextView TVGameTitle;
    TextView TVGameDescription;
    ImageView IMGGameImage;

    TextView TVSeenCounter;
    TextView TVCommentCounter;
    TextView TVLikeCounter;

    ImageView IMGSeenView;
    ImageView IMGCommentView;
    ImageView IMGLikeView;

    TextView TVReviewer;

    ProgressBar ProgressLoadPhoto;

    ImageView IMGBookmarkView;
    private RelativeLayout ROWGameReviewContainer;

    private RecyclerViewClickListener mListener;

    public GameReviewViewHolder(View itemView, RecyclerViewClickListener listener) {
        super(itemView);

        TVGameDate = itemView.findViewById(R.id.TV_GameDate);
        TVGameTitle = itemView.findViewById(R.id.TV_GameTitle);
        TVGameDescription = itemView.findViewById(R.id.TV_GameDescription);
        IMGGameImage = itemView.findViewById(R.id.IMG_GameImage);

        TVSeenCounter = itemView.findViewById(R.id.TV_SeenCounter);
        TVCommentCounter = itemView.findViewById(R.id.TV_CommentCounter);
        TVLikeCounter = itemView.findViewById(R.id.TV_LikeCounter);

        IMGSeenView = itemView.findViewById(R.id.IMG_SeenView);
        IMGCommentView = itemView.findViewById(R.id.IMG_CommentView);
        IMGLikeView = itemView.findViewById(R.id.IMG_LikeView);

        TVReviewer = itemView.findViewById(R.id.TV_Reviewer);

        ProgressLoadPhoto = itemView.findViewById(R.id.Progress_LoadPhoto);

        IMGBookmarkView = itemView.findViewById(R.id.IMG_BookmarkView);
        ROWGameReviewContainer = itemView.findViewById(R.id.ROW_GameReviewContainer);

        mListener = listener;
        ROWGameReviewContainer.setOnClickListener(this);
        IMGCommentView.setOnClickListener(this);
        IMGLikeView.setOnClickListener(this);
        IMGBookmarkView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.ROW_GameReviewContainer:
                mListener.onRowGameReviewContainerClick(ROWGameReviewContainer, getAdapterPosition());
                break;
            case R.id.IMG_CommentView:
                mListener.onRowCommentViewClick(IMGCommentView, getAdapterPosition());
                break;
            case R.id.IMG_LikeView:
                mListener.onRowLikeViewClick(IMGLikeView, getAdapterPosition());
                break;
            case R.id.IMG_BookmarkView:
                mListener.onRowBookmarkViewClick(IMGBookmarkView, getAdapterPosition());
                break;
            default:
                break;
        }
    }

}

public interface RecyclerViewClickListener {
    void onRowGameReviewContainerClick(View view, int position);
    void onRowCommentViewClick(View view, int position);
    void onRowLikeViewClick(View view, int position);
    void onRowBookmarkViewClick(View view, int position);
}

//TYPE_TOPREVIEWER
public class GameReviewTopReviewerViewHolder extends RecyclerView.ViewHolder{
    Button BTNToBeReviewer;


    public GameReviewTopReviewerViewHolder(View itemView) {
        super(itemView);

        BTNToBeReviewer = itemView.findViewById(R.id.BTN_ToBeReviewer);

    }


}

//TYPE_ADSBANNER
public class GameReviewAdsBannerViewHolder extends RecyclerView.ViewHolder{


    public GameReviewAdsBannerViewHolder(View itemView) {
        super(itemView);


    }


}



@Override
public int getItemViewType(int position) {
    if (mWithTopReviewer && isPositionTopReviewer(position))
        return TYPE_TOPREVIEWER;
    if (mWithAdsBanner && isPositionAdsBanner(position))
        return TYPE_ADSBANNER;

    return TYPE_ITEM;
}


public boolean isPositionTopReviewer(int position) {
    return position == 1 && mWithTopReviewer;
}
public boolean isPositionAdsBanner(int position) {
    return position == getItemCount() - 1 && mWithAdsBanner;
}
public void setWithTopReviewer(boolean value) {
    mWithTopReviewer = value;
}
public void setWithAdsBanner(boolean value) {
    mWithAdsBanner = value;
}

}

您错误地实现了此方法

@Override
public int getItemCount() {
    int itemCount = 0;
    if(mWithTopReviewer == true){
        itemCount++;
    }
        itemCount = modelGameReviews.size();

    return itemCount;
}
应该是类似的

@Override
public int getItemCount() {
    int itemCount = modelGameReviews.size();
    if(mWithTopReviewer == true){
        itemCount++;
    }

    return itemCount;
}

使用recycler视图的getItemViewType()方法使用多个视图types@Sandeepdhiman请阅读我的适配器代码,我已经实现了getItemViewType(),我尝试了它,它变成了崩溃java.lang.IndexOutOfBoundsException:Index:3,Size:3位于java.util.ArrayList.get(ArrayList.java:437)在com.indofun.android.indojoy.Adapters.Adapter\u GameReview.AdapterGameReview.onBindViewHolder(AdapterGameReview.java:103)@SunggakiChannel返回值
getItemCount()
表示列表中有多少项。你的数组大小是3。但是,如果要显示四个项目,数组还应该有4个项目。因此,如果(mWithTopReviewer==true){itemCount++;}应该使大小变为4,但它仍然崩溃
@Override
public int getItemCount() {
    int itemCount = modelGameReviews.size();
    if(mWithTopReviewer == true){
        itemCount++;
    }

    return itemCount;
}