简体   繁体   English

RecylerView中的多重布局

[英]Multi layout in RecylerView

I am trying to use a RecyclerView grid item so that at position one it displays 2 items side by side, at position 2 it should display 1 item. 我正在尝试使用RecyclerView网格项,以便在位置1并排显示2个项目,在位置2它应显示1个项目。
Here is my adapter class code; 这是我的适配器类代码; it displays grid items on 2 columns, but I need like in the image below. 它在2列上显示网格项,但我需要如下图所示。
图片
MainFragment.class MainFragment.class

public class MoviesFragment extends Fragment {

private MoviesAdapter mAdapter;
private RecyclerView mRecyclerView;

RecyclerView.LayoutManager mLayoutManager;

public MoviesFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View rootview= inflater.inflate(R.layout.fragment_movies, container, false);

    mRecyclerView = (RecyclerView)rootview.findViewById(R.id.list);
    mRecyclerView.setHasFixedSize(true);

    // The number of Columns
    mLayoutManager = new GridLayoutManager(getActivity(), 2);
    mRecyclerView.setLayoutManager(mLayoutManager);


    mAdapter = new MoviesAdapter(Arrays.asList(
            new CardViewData("hdh", "Direction pp", R.drawable.arya_movie),
            new CardViewData("jdjd", "Description of Item 1", R.drawable.julaie),
            new CardViewData("hdhd", "Description of Item 2", R.drawable.badrinadg),
            new CardViewData("hdhd", "Description of Item 3", R.drawable.happy),
            new CardViewData("hdhd", "Description of Item 4", R.drawable.julai),
            new CardViewData("hdhd", "Direddctor : sahs", R.drawable.vedam_movie)));

    mRecyclerView.setAdapter(mAdapter);
    return rootview;

}

} }

Here is my adapter class: 这是我的适配器类:
MovieAdapter.class MovieAdapter.class

public class MoviesAdapter extends RecyclerView.Adapter<MoviesAdapter.ViewHolder> {



private List<CardViewData> mDataset;

public MoviesAdapter(List<CardViewData> dataset) {
    mDataset = dataset;
}

@Override
public ViewHolder onCreateViewHolder(final ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.moview_card_layout, viewGroup, false);
    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(final ViewHolder viewHolder, int i) {
    final CardViewData cardViewData = mDataset.get(i);

    viewHolder.mTitle.setText(cardViewData.getTitle());
    viewHolder.mDescription.setText(cardViewData.getDescription());
    viewHolder.mImage.setImageResource(cardViewData.getImage());

    viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(v.getContext(), "Title: " + cardViewData.getTitle(), Toast.LENGTH_SHORT).show();
        }
    });
}

@Override
public int getItemCount() {
    return mDataset == null ? 0 : mDataset.size();

}

public static class ViewHolder extends RecyclerView.ViewHolder {

    public TextView mTitle;
    public TextView mDescription;
    public ImageView mImage;

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

        mTitle = (TextView) itemView.findViewById(R.id.row_title);
        mDescription = (TextView) itemView.findViewById(R.id.row_description);
        mImage = (ImageView) itemView.findViewById(R.id.row_image);
    }
}

} }

@Override
public int getViewType(int position) {
    if (position == 0) {
        return TYPE_1;
    }else if(position == 1){
        return TYPE_2; 
    }
}

@Override
public RecyclerView.ViewHolder getView(ViewGroup parent, int viewType) {
    if (viewType == TYPE_1) {
        View view = inflater.inflate(R.layout.type_one_layout, parent, false);
        return new Type1Holder(view);
    } else {
        View view = inflater.inflate(R.layout.type_two_layout, parent, false);
        return new Type2Holder(view);
    }
 }

@Override
public void onBindView(RecyclerView.ViewHolder viewHolder, int i) {
    if (viewHolder instanceof Type1Holder) {
        /// Insert the data into the UI of Type1
    }else if(viewHolder instanceof Type1Holder){
        /// Insert the data into the UI of Type2
    }
 static final int TYPE_HEADER = 0;
 static final int TYPE_CELL = 1;

 @Override
public int getViewType(int position) {
if (position == 0) {
    return TYPE_HEADER;
}else if(position == 1){
    return TYPE_CELL; 
}

 @Override
public RecyclerView.ViewHolder getView(ViewGroup parent, int viewType) {
if (viewType == TYPE_HEADER) {
    View view = inflater.inflate(R.layout.header_layout, parent, false);
    return new Type1Holder(view);
} else {
    View view = inflater.inflate(R.layout.cell_layout, parent, false);
    return new Type2Holder(view);
}
@Override
public void onBindView(RecyclerView.ViewHolder viewHolder, int i) {
if (viewHolder instanceof Type1Holder) {
    /// Insert the data into the UI of Type1
}else if(viewHolder instanceof Type1Holder){
    /// Insert the data into the UI of Type2
}

You need to override this method and return the view type depends on the item position, in your case, it should be like this: 您需要重写此方法,并根据项目位置返回视图类型,在这种情况下,应如下所示:

@Override
public int getItemViewType(int position) {
    switch (position) {
        case 0:
            return layout_1_with_int_value;
        case 1:
            return layout_2_with_int_value;
        default:
            return default_layout_with_int_value;
    }
}

And you need create different ViewHolder subclass for each type of layout, then in method @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {} you ininflater different layout depends on the viewType. 并且您需要为每种布局类型创建不同的ViewHolder子类,然后在方法@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {} ,根据视图类型充气不同的布局。 But there is one more step before finish it all, in method public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, int position) {} you call int viewType = getItemViewType(position); 但是在完成所有操作之前还需要执行另一步骤,在方法public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, int position) {}您可以调用int viewType = getItemViewType(position); to get the view type for the current position and create the right ViewHolder. 获取当前位置的视图类型并创建正确的ViewHolder。

Done! 完成!

Hope it will help :) 希望它会有所帮助:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM