web-dev-qa-db-ja.com

LinearLayoutManagerでアイテムをオーバーラップする方法-RecyclerView(カードの積み重ねなど)


RecyclerViewのアイテムをオーバーラップさせることは可能ですか?
LinearLayoutManagerでそれを試しています。
私の要件はLinearLayoutManagerの場合とまったく同じであり、内部のアイテムを上から下にオーバーラップする必要があります。 (トランプのように)

私はListViewを使用して いくつかのバリアント を見てきました。ですから、RecyclerViewでも可能だと思いますが、何度か調べてみると、カスタムレイアウトマネージャーを実装するのにかなりの時間がかかり、これについてかなり理解しているように感じます(Daveの投稿を調べました)について カスタムLayoutManagerの構築

そのため、今では、カスタムレイアウトマネージャーのこのような複雑さに対処する代わりに、要件に基づいてListViewバリエーションを使用する必要があるかもしれないと考えています。

ただし、内部のアイテムをオーバーラップさせる必要があります。まだ気づいていない方向性があるのではないかと思います。 上記のListViewバリアント以外およびカスタムレイアウトマネージャーがあるかどうかをお知らせください。

私はまた、ここに私の発見を投稿します。

22
Aung Pyae

私はあなたが部分的な重複を探していると思います(例えば、カードのデッキがわずかに扇形に広がっています)。もしそうなら、これはRecyclerViewとカスタムItemDecorationでかなり簡単に見えます。これは、アイテムを垂直方向に90pxオーバーラップする簡単な例です。

public class OverlapDecoration extends RecyclerView.ItemDecoration {

  private final static int vertOverlap = -90;

  @Override
  public void getItemOffsets (Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {

    outRect.set(0, vertOverlap, 0, 0);

  }
}

この例ではオフセットをハードコーディングしていますが、リストアイテムの高さが異なる場合は、このためのロジックを測定して追加する必要があります。

レイアウトマネージャーを設定する前に、この装飾をRVに追加してください。 StaggeredGridで試しましたが、LinearLayoutとGridLMでも機能するはずです。

32
MojoTosh

ItemDecorationRecyclerViewを使用して達成できます

set ItemDecoration:

var customAdapter = CustomListAdapter()
recyclerView.addItemDecoration(MyItemDecoration()) // here set decoration in recyclerview
recyclerView.layoutManager = LinearLayoutManager(context)
recyclerView.adapter = customAdapter

ItemDecorationクラスを作成します:

class MyItemDecoration : RecyclerView.ItemDecoration() {

    private val overlapValue = -60

    override fun getItemOffsets(outRect : Rect, view : View, parent : RecyclerView, state : RecyclerView.State) {
        outRect.set(0, 0, 0, overlapValue)  // args is : left,top,right,bottom
    }
}
0
Sanjayrajsinh