Recyclerview를 스크롤시 현재 화면에 보여지는 첫번째 데이터 인덱스와 마지막 데이터의 인덱스를 보여주는 테스트해보기 위해 작성되었습니다.
다음 포스팅의 코드를 기반으로 변경 및 추가해야 할 부분만 설명합니다.
FrameLayout을 사용하면 두 개의 UI를 겹쳐보이게 할 수 있습니다.
RecyclerView(recyclerview_main_list)와 두개의 TextView를 포함하고 있는 ConstraintLayout를 똑같은 크기로 FrameLayout 안에 배치했습니다.
다음처럼 Recyclerview 상단과 하단에 데이터의 인덱스가 붉은색 글자로 보여지게 됩니다.
activity_main.xml 파일을 다음처럼 수정합니다.
FrameLayout(framelayout_main) 내부에 RecyclerView(recyclerview_main_list)와 ConstraintLayout(constraintLayout_main)이 같은 크기를 갖도록 했습니다.
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity">
<FrameLayout android:id="@+id/framelayout_main" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintVertical_weight="9" app:layout_constraintBottom_toTopOf="@+id/button_main_insert" app:layout_constraintTop_toTopOf="parent" >
<android.support.v7.widget.RecyclerView android:id="@+id/recyclerview_main_list" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbarFadeDuration="0" android:scrollbarSize="10dp" android:scrollbarThumbVertical="@android:color/darker_gray" android:scrollbars="vertical"/>
<android.support.constraint.ConstraintLayout android:id="@+id/constraintLayout_main" android:layout_width="match_parent" android:layout_height="match_parent">
<TextView android:id="@+id/textview_recyclerview_top" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintHorizontal_chainStyle="spread_inside" android:textColor="#A0FF0000" android:background="#A0FFFF00" android:textSize="25sp" android:text="TextView"/>
<TextView android:id="@+id/textview_recyclerview_bottom" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="10dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_chainStyle="spread_inside" android:textColor="#A0FF0000" android:background="#A0FFFF00" android:textSize="25sp" android:text="TextView"/> </android.support.constraint.ConstraintLayout>
</FrameLayout>
<Button android:id="@+id/button_main_insert" android:layout_width="match_parent" android:layout_height="0dp" android:text="데이터 추가" app:layout_constraintVertical_weight="1" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toBottomOf="@+id/recyclerview_main_list" />
</android.support.constraint.ConstraintLayout> |
MainActivity.java 파일에 다음 코드를 추가합니다.
스크롤하다가 정지하면 RecyclerView에 보이는 첫번째 줄과 마지막 줄에 있는 데이터의 인덱스를 보여주는 코드입니다.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
. . . . . . . . . . . . . . . . . . . . . . .
// 인덱스를 보여줄 TextView의 초기 상태는 화면에 보이지 않는 것입니다. final TextView showIndex_first = (TextView) findViewById(R.id.textview_recyclerview_top); final TextView showIndex_last = (TextView) findViewById(R.id.textview_recyclerview_bottom); showIndex_first.setVisibility(View.GONE); showIndex_last.setVisibility(View.GONE);
// 테스트 편의상 50개의 데이터를 미리 입력해둡니다ㅏ. for ( int i = 0; i < 50; i++ ) { count++;
// Dictionary 생성자를 사용하여 ArrayList에 삽입할 데이터를 만듭니다. Dictionary dict = new Dictionary(count + "", "apple" + count, "사과" + count);
mArrayList.add(dict); // RecyclerView의 마지막 줄에 삽입 mAdapter.notifyItemInserted(0); }
// RecyclerView에 스크롤이 발생될때 호출되는 메소드를 구현합니다. mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy);
}
// RecyclerView의 스크롤 상태가 변할때 호출됩니다. @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState);
// RecyclerView의 첫번째 줄과 마지막줄에 보이는 줄(row)의 인덱스를 찾습니다. int firstVisibleItemPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition(); int lastVisibleItemPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastVisibleItemPosition(); int itemTotalCount = recyclerView.getAdapter().getItemCount() - 1;
// 인덱스를 화면에 보여줍니다. if (firstVisibleItemPosition == 0) { showIndex_first.setText("First Position"); } else { showIndex_first.setText(firstVisibleItemPosition + ""); }
if (lastVisibleItemPosition == itemTotalCount) { showIndex_last.setText("Last Position"); } else { showIndex_last.setText(lastVisibleItemPosition + ""); }
// 스크롤 상태가 아닐때에만 인덱스를 화면에 보여줍니다. if ( newState == android.support.v7.widget.RecyclerView.SCROLL_STATE_IDLE ){ showIndex_first.setVisibility(View.VISIBLE); showIndex_last.setVisibility(View.VISIBLE); }else { showIndex_first.setVisibility(View.GONE); showIndex_last.setVisibility(View.GONE); }
} });
}
|
실행시켜 보면 스크롤 하다 멈추면 현재 화면에 보이는 데이터의 인덱스를 보여줍니다.
2018년 8월 10일에 마지막으로 업데이트 되었습니다. webnautes