반응형

Recyclerview를 스크롤시 현재 화면에 보여지는 첫번째 데이터 인덱스와 마지막 데이터의 인덱스를 보여주는 테스트해보기 위해 작성되었습니다.  

다음 포스팅의 코드를 기반으로 변경 및 추가해야 할 부분만 설명합니다.



Android  RecyclerView 간단한 예제

http://webnautes.tistory.com/1214






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



반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts