Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

item recycleview horizontal iniciar no meio da lista

Boa noite Senhores, tenho um recycleview horizontal funcionando correto, porem quero fazer esse efeito do exemplo , os itens começa quase no meio do recycleview ae depois de rolar para o lado ele preenche todo o espaço ficando assim aqui achei que seria apenas um padding-left, mas nao é nem margin, alguem sabe ou como pesquisar para conseguir esse feito, agradeço obrigado.

7 respostas

Fala ai Marlos, de boa ?

Na real eu não entendi o que você precisa, contudo dá uma olhada nisso aqui de repente te dá uma ajuda.

fiz um video de um app que tem esse efeito, https://drive.google.com/open?id=1qZcA-_R_RfQZUZVkfjyX7TBCukE0REfm

solução!

Oi Marlos, blz?

Do jeito que exemplificou, dá pra fazer criando uma view com fundo transparente no onCreateViewHolder(). Porém, tem algumas regrinhas pra seguir para evitar bugs:

  1. Adicione uma condição para que essa view transparente seja criada apenas uma única vez. Você pode criar um atributo boolean que indica quando deve ser criado, então atribui false quando criar a view transparente.

  2. Ao realizar o bind, você precisa verificar se a posição é a primeira (nesse caso 0) se for, você não deve fazer o bind com o ViewHolder normal, pois a view inicial é a view transparente que não contém as views para realizar o bind.

Basicamente esses são os passos, o que precisa ficar mais atento é no tamanho que vai adicionar na view transparente, para que ela ocupe o espaço desejado. Tenta implementar, caso não conseguir, manda pra gente como ficou e a implementação que fez :)

[]s

Marlos, a solução que te mandei inicialmente foi uma maneira beeeeem manual de ser feita, fiz um teste aqui e parece que funciona também usando o seguinte código no próprio XML:

<android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:clipToPadding="false"
        android:orientation="horizontal"
        android:paddingStart="100dp"/>

Implemente a que preferir e nos mande um feedback se der certo :)

[]s

Obrigado Alex pela resposta e pela atenção,mas eu fiz assim:

Obrigado Alex pela resposta e pela atenção, mas conseguir dessa maneira, aprova?

public class HeaderDecoration extends RecyclerView.ItemDecoration {

private View mLayout;

public HeaderDecoration(final Context context, RecyclerView parent, @LayoutRes int resId) {
    // inflate and measure the layout
    mLayout = LayoutInflater.from(context).inflate(resId, parent, false);
    mLayout.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
            View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
}


@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
    super.onDraw(c, parent, state);
    // layout basically just gets drawn on the reserved space on top of the first view
    mLayout.layout(parent.getLeft(), 0, parent.getRight(), mLayout.getMeasuredHeight());
    for (int i = 0; i < parent.getChildCount(); i++) {
        View view = parent.getChildAt(i);
        if (parent.getChildAdapterPosition(view) == 0) {
            c.save();
            final int height = mLayout.getMeasuredHeight();
            final int top = view.getTop() - height;
            c.translate(0, top);
            mLayout.draw(c);
            c.restore();
            break;
        }
    }
}

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
    if (parent.getChildAdapterPosition(view) == 0) {
        outRect.set( mLayout.getMeasuredHeight(),0, 0, 0);
    } else {
        outRect.setEmpty();
    }
}

}

no Fragment que tem o recycleview

recyclerVieweventos.addItemDecoration(new HeaderDecoration(getContext(), recyclerVieweventos, R.layout.header_evento));

Que bom que conseguiu Marlos, mas tenho uma observação. Se você chegou no resultado esperado, maravilha! O primeiro passo foi realizado, porém, quanto mais simples o código for melhor tanto para você quanto para outra pessoa que for ler o seu código ou tiver que dar manutenção.

Em outras palavras, a abordagem que considerou me parece bem complexa e manual, eu, por exemplo, não havia visto essa implementação e parece que faz bastante processo que não deveria ser de responsabilidade do desenvolvedor e sim da própria API, o maior problema é se um dia acontecer algum bug inesperado, vai ser mais difícil de resolver.

Portanto, acredito que vale a pena tentar encontrar uma solução mais simples para evitar complicações futuras :)

[]s