2015-12-30 4 views
1

Я пытаюсь использовать элемент сетки RecyclerView, так что в позиции 1 он отображает 2 элемента бок о бок, в позиции 2 он должен отображать 1 элемент.
Вот мой код класса адаптера; он отображает элементы сетки на 2 столбца, но мне нужно, как на изображении ниже.
Image
MainFragment.classМногократная компоновка в RecylerView

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; 

} 

}

Вот мой адаптер класс:
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); 
    } 
} 

}

ответ

0
@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 
    } 
+0

мне нужно, что цикл должно повторять п число элементов, такие как положение-2 coloumns и каждого следующего Colum следующего 2 следующего 1 ..... – vishnu

+0

И оно основано на вашем логика, какой тип вы отправляете в getViewType(), –

0
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 
} 
+0

Мне нужно, чтобы цикл должен повторять n количество элементов, таких как позиция 1 2 coloumns и следующий один colum, следующий следующий 2 следующий 1 – vishnu

0

Вы должны переопределить этот метод и возвращать тип вида зависит от положения элемента в вашем случае, это должно быть так:

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

И вам нужно создавать различную ViewHolder подкласс для каждого типа макета, то в методе @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {} вы ininflater различная компоновка зависит от вида вида. Но есть еще один шаг, прежде чем закончить все, в методе public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, int position) {} вы вызываете int viewType = getItemViewType(position);, чтобы получить тип вида для текущей позиции и создать правый ViewHolder.

Выполнено!

Надеется, что это поможет :)

Смежные вопросы