Today's

길을 나서지 않으면 그 길에서 만날 수 있는 사람을 만날 수 없다

모바일 앱(안드로이드)

안드로이드 앱 만들기 : 리사이클 뷰의 활용성에 대해서.

Billcorea 2022. 1. 9. 09:20
반응형

예전에 listview 을 이용해서 화면에 정보를 표시하는 기능을 구현했다. 단순 목록 형태의 리스트 뷰이기 때문에 데이터를 여러개 보여줄 때 쉽게 사용할 수 있었기 때문이기도 하고... 뭐 아무튼지...

 

그러다가 recycleview 을 알게 되어 사용하면서 부터 여러가지 시도를 해 볼 수 있게 되었다. recycleview 의 경우 listview 처럼 쉽게 목록을 보여주기도 하지만, gridview 와 같이 바둑판 모양의 화면을 그려줄 수도 있다.  그래서 쉽게 화면의 모양을 구현할 수 있다는 것을 알게 되었다. 

 

 

 

실행되는 모습을 보면 마치 gridview 을 구현해 놓은 것 같지만, 실상은 recycleview 을 구현하고 모양만 변화를 주었을 뿐이다. 

        binding.listData.setAdapter(recyclerAdMobAdapter);
//        binding.listData.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
        binding.listData.setLayoutManager(new GridLayoutManager(getApplicationContext(), 3));
        binding.listData.addItemDecoration(new GridSpacing(20, 20));

layoutmanager 을 LinearLayout 에서 GridLayoutManager 로 변경했을 뿐인데... 모양이 저렇게 변한 것이다. decoration 은 grid 모양일 때 간격을 두기 위해서 사용한 것이고, 딱히 다른 것을 한 것은 없는 것이라, 다양한 모양 변화를 줄 수 있어서 좋은 것 같다.

 

끝.

 

참고로 decoration 은 위한 소스는 아래와 같다.

import android.graphics.Rect;
import android.view.View;

import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

public class GridSpacing extends RecyclerView.ItemDecoration {
    private int mSpacing;
    private int mTopSpacing;

    public GridSpacing(int spacing, int topSpacing) {
        this.mSpacing = spacing;
        this.mTopSpacing = topSpacing;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state)
    {
        super.getItemOffsets(outRect, view, parent, state);
        // Column Index
        int index = ((GridLayoutManager.LayoutParams) view.getLayoutParams()).getSpanIndex();
        // Item 포지션
        int position = parent.getChildLayoutPosition(view);
        if (index == 0) {
            //좌측 Spacing 절반
            outRect.right = mSpacing/ 2;
        } else {
            //우측 Spacing 절반
            outRect.left = mSpacing/ 2;
        } // 상단 탑 Spacing 맨 위에 포지션 0, 1은 Spacing을 안 줍니다.
        if (position < 2) {
            outRect.top = 0;
        } else {
            outRect.top = mTopSpacing;
        }
    }
}

 

반응형