0

Я пытаюсь достичь customn RowSpan в StaggeredGridКак реализовать Dynamic Row Span в StaggeredGridLayoutManager

enter image description here

Как динамически изменять RowSpan моего StaggeredGridLayout. Существует одна реализация предложена @Gabriele Mariotti

StaggeredGridLayoutManager.LayoutParams layoutParams =StaggeredGridLayoutManager.LayoutParams) viewHolder.itemView.getLayoutParams(); 
layoutParams.setFullSpan(true); 

Но я не могу заставить его работать. Пожалуйста, предложите мне некоторые способы реализовать это.

Вот код для моего класса адаптера, который расширяет адаптер Recycler вместе с классом Вид держателя в виде вложенного класса

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { 
    LayoutInflater inflater; 
Context context; 
List<Information> data= Collections.emptyList(); 
public MyAdapter(Context context,List<Information>data) 
{ 
    inflater= LayoutInflater.from(context); 
    this.context=context; 
    this.data=data; 
} 
@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view=inflater.inflate(R.layout.custom_layout,parent,false); 
    MyViewHolder holder=new MyViewHolder(view); 
    return holder; 
} 

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
    Information current=data.get(position); 
    holder.imageView.setImageResource(current.iconid); 
    if(position==0) { 
     StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) holder.itemView.getLayoutParams(); 
     layoutParams.setFullSpan(true); 
    } 

} 


@Override 
public int getItemCount() { 
    return 8; 
} 

class MyViewHolder extends RecyclerView.ViewHolder{ 
ImageView imageView; 
    public MyViewHolder(View itemView) { 
     super(itemView); 
     imageView= (ImageView) itemView.findViewById(R.id.image); 

    } 
} 
} 

ответ

0

Вы можете попробовать этот код, это создаст макет в вашем образце изображения, где первый элемент охватывает два столбца:

 // Create a grid layout with two columns 
     GridLayoutManager layoutManager = new GridLayoutManager(this, 2); 

     // Create a custom SpanSizeLookup where the first item spans both columns 
     layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
      @Override 
      public int getSpanSize(int position) { 
       return position == 0 ? 2 : 1; 
      } 
     }); 

     recyclerView.setLayoutManager(layoutManager); 

элементов в вашем образце изображении не выглядит сдвинутое для меня, так это использует регулярные 2-колонки GridLayoutManager. Я не уверен, как это работает с StaggeredGridLayoutManager, но попробуй.

+0

Ну, я пробовал этот трюк, и да, он работает: '). Но суть в том, что мои изображения извлекаются через файл JSON, и нет никаких фиксированных позиций относительно того, какие изображения будут выбраны для охвата одного столбца или двух столбцов. Является ли это тем, что я могу сделать это динамически, зависит от ширины изображения? Кроме того, yeh это шаблон, который я искал, я на самом деле хочу реализовать шахматный макет. –

+0

Тогда подход будет состоять в том, чтобы использовать параметр позиции для получения элемента из адаптера (вам нужно получить ссылку на адаптер в 'SpanSizeLookup', возможно, путем подкласса), посмотрите на ширину изображения на этом элементе и верните размер диапазона на основе этого. Надеемся, ваши данные JSON скажут вам, является ли это широкоформатным или нет, поэтому вам не нужно дождаться загрузки самого изображения, чтобы выяснить размер пролета. Если нет, то вы можете добавить что-то в свой JSON, чтобы помочь вам определить размер диапазона. Если вы разместите свой код адаптера, я могу отправить пример кода для этого. –

+0

Я сделал редактирование на вопрос, –

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