Определить столбец, в котором элемент отображается в RecyclerView - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть RecyclerView, который использует GridLayoutManager для рендеринга моего набора данных.

spanCount для менеджера макета равно 2, но я устанавливаю SpanSizeLookup, чтобы я мог отображать некоторые элементы в виде строк (spanSize = 2), а другие - только половинную ширину (spanSize = 1).

layoutManager = new GridLayoutManager(this.getContext(), 2);
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
   @Override
   public int getSpanSize(int position) {
       return getSpanSizeByPosition(position);
   }
});

Теперь мне нужно определить (в методе адаптера onBindViewHolder(), если это возможно), будет ли элемент отображаться слева или справа, в случае, если это элемент «полуширины».

Было бы тривиально, если бы все предметы были "полуширины". Простая проверка boolean buttonIsOnTheLeft = position % 2 == 0; будет достаточно. Но это не работает, если не все элементы имеют «половинную ширину».

Я подозреваю, что мне нужно будет работать с менеджером по расположению, чтобы найти эту информацию, но не знаю, как ...

Итак, кто-то видит, как я могу этого достичь?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Я нашел решение. В методе onBindViewHolder() мне просто нужно вызвать этот метод, который я реализовал:

private boolean isButtonIsOnTheLeft(int position, NodeStructureTreeViewAdapter adapter) {
        GridLayoutManager layoutManager = adapter.getLayoutManager();
        int spanIndex = layoutManager.getSpanSizeLookup().getSpanIndex(position, layoutManager.getSpanCount());
        return spanIndex == 0;
}

Конечно, я реализовал метод getLayoutManager() в своем адаптере, который извлекает его из экземпляра recyclerView.

0 голосов
/ 19 ноября 2018

Вы можете прочитать GridLayoutManager.LayoutParams каждого ViewHolder, затем Вы получите доступ к getSpanIndex и getSpanSize.

Однако эти значения устанавливаются после выкладки вида, что происходит позже (и чаще), чем onBindViewHolder(). Обратный вызов для этого события onViewAttachedToWindow(RecyclerView.ViewHolder holder) метод:

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

    // ... 

    @Override
    public void onViewAttachedToWindow(@NonNull RecyclerView.ViewHolder holder) {
        if(holder.itemView.getLayoutParams() instanceof GridLayoutManager.LayoutParams){
            GridLayoutManager.LayoutParams lp = (GridLayoutManager.LayoutParams) holder.itemView.getLayoutParams();
            holder.title.setText("In column "+lp.getSpanIndex()+", size "+lp.getSpanSize());
        }
    }
}
...