Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

에이치의 모바일 앱 개발

View-RecyclerView 본문

Android/Android 개발 소스

View-RecyclerView

로이누리 2019. 2. 20. 18:40

RecyclerView 란 Android Lollipop 부터 사용 가능한 ListView 입니다.

ListView 메모리 관리 및 구조 처리를 더 완고하게 만든 뷰인데요.

정확한 정보는 구글 문서를 통해 확인하도록 합니다.

https://developer.android.com/guide/topics/ui/layout/recyclerview#kotlin


기존 ListView 를 사용하셨을 직접 작성하였던 ViewHolder 역시 해당 라이브러리에 내장 되어있어, view find 리소스 낭비를 줄이고 있습니다.

그 외에 간격 설정으로도 사용하는 Decoration 설정도 가능합니다.


예제 코드를 보겠습니다.

저는 크게 세가지 분류로 나누어 관리합니다.

RecyclerView, Adapter, Decoration 으로 나뉘며 Decoration 경우 선택 항목입니다.


해당 뷰를 사용함에 앞서 gradle에 라이브러리 연동해 줍니다.

implementation 'com.android.support:recyclerview-v7:28.0.0'


먼저 RecyclerView 입니다.

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
binding.customRv.setLayoutManager(linearLayoutManager);
binding.customRv.setHasFixedSize(true);

List<String> stringList = new ArrayList<>();
stringList.add("A");
stringList.add("B");
stringList.add("C");

CustomAdapter.OnAdapterViewClickListener onAdapterViewClickListener = new CustomAdapter.OnAdapterViewClickListener() {
@Override
public void onAdapterViewClick(View view, int position) {

}
};

CustomAdapter mAdapter = new CustomAdapter(stringList, onAdapterViewClickListener);
binding.customRv.addItemDecoration(new CustomDecoration(this, 10, 10, 2));
binding.customRv.setAdapter(mAdapter);


Activity 클래스 내부에서 리사이클 뷰를 선언합니다.

'customRv' 라는 명칭으로 리사이클 뷰를 사용하고 있습니다.

해당 뷰에 addItemDecoration 함수로 커스텀한 CustomDecoration 을 넣어줍니다.

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.CustomViewHolder> {

private List<String> strings;
private OnAdapterViewClickListener onAdapterViewClickListener;

public interface OnAdapterViewClickListener {
void onAdapterViewClick(View view, int position);
}

public CustomAdapter(List strings, OnAdapterViewClickListener onAdapterViewClickListener) {
this.strings = strings;
this.onAdapterViewClickListener = onAdapterViewClickListener;
}

@Override
public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new CustomViewHolder(AdapterCustomBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
}

@Override
public void onBindViewHolder(CustomViewHolder holder, int position) {
holder.bind(position);
}

@Override
public int getItemCount() {
return strings.size();
}

public class CustomViewHolder extends RecyclerView.ViewHolder {
private AdapterCustomBinding binding;

public void bind(final int position) {
binding.getRoot().setOnClickListener(v -> onAdapterViewClickListener.onAdapterViewClick(v, position));
String string = strings.get(position);
binding.stringTv.setText(string);
}

public CustomViewHolder(AdapterCustomBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
}
}


click event interface 도 넘겨 각각의 View 가 사용 가능하게 합니다.

기본적으로 필요한 사항을 되도록 베이스를 유지해 가며 코딩을 하였는데, 본인 입맛에 맞게 커스텀 하시면 됩니다.


마지막으로 CustomDecoration 설명을 하자면, getItemOffsets 메서드를 통해 outRect 설정하여 간격조정을 합니다.

메소드 내부에 left, top, right, bottom, item count, span count을 고려하여 외곽과 View 사이 간격을 설정하면 되겠습니다.

추가로, 끝과 끝 뷰들의 외곽 간격은 setClipToPadding 을 메서드를 통해 설정 가능합니다.



스크롤 감지 부분 추가합니다.

private int lastPosition = -1;

binding.customRv.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
if (newState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
if (linearLayoutManager.findLastVisibleItemPosition() == (linearLayoutManager.getItemCount() - 1) && linearLayoutManager.findLastVisibleItemPosition() != lastPosition) {
}
lastPosition = manager.findLastVisibleItemPosition();
}
}
});

lastPosition 경우 마지막 아이템 호출시 중복 처리는 상황을 염두하여 넣었습니다.


세부 코드


아이템 변경시 notify 함수를 사용할텐데,  다음과 같다.

void notifyItemChanged(int position, {option}Object payload)

void notifyItemInserted(int position) // position : 추가된 위치

void notifyItemMoved(int fromPosition, int toPosition)

void notifyItemRangeChanged(int positionStart, int itemCount, {option}Object payload)

void notifyDataSetChanged()



'Android > Android 개발 소스' 카테고리의 다른 글

Databinding  (0) 2019.05.15
Android Device Screen zoom 획득  (2) 2019.03.07
View-ImageView-Picasso-blur  (0) 2019.02.20
View-ImageView-Gradient  (0) 2019.02.20
Battery-Awake, Sleep  (0) 2019.02.20
Comments