Android에서 Recyclerview에 헤더를 추가하는 방법

55330 단어 androidbeginnersjava
Android에서 Recyclerview는 Listview 및 Gridview의 유연하고 업그레이드된 고급 버전입니다. 그것은 빠르게 안드로이드 응용 프로그램에서 가장 많이 사용되는 구성 요소 중 하나가 되고 있습니다. 많은 양의 데이터 세트 및 컬렉션을 나열하는 데 더 적은 메모리를 사용합니다. 또한 사용자에게 더 나은 경험을 제공합니다.

recyclerview에 헤더 항목을 추가하기 위해 완성된 모델을 찾고 있었는데, 간결하고 명료한 것을 발견할 수 없었습니다. 이 블로그에서는 Android 애플리케이션용 recyclerview에 헤더 항목을 추가하는 데 사용할 수 있는 모델을 개발하려고 합니다.

아래 스크린샷을 보고 이 자습서에서 달성하려는 내용에 대한 아이디어를 얻으십시오.

잘못 정렬된 보기 항목 출력





실제 출력





시작하자.

1. 지원 라이브러리 추가



Recyclerview가 프로젝트에서 작동하려면 다음 지원 라이브러리를 gradle(Module.app)에 추가해야 합니다.

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

2. Recyclerview 만들기



향상된 경험을 위해 listview의 Recyclerview 인스턴스를 사용하고 XML에서 정의하는 것은 매우 간단합니다. 다음과 같이 xml에서 정의할 수 있습니다.

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin" 
   tools:context=".MainActivity">
   <android.support.v7.widget.RecyclerView
       android:id="@+id/my_recycler_view"
       android:scrollbars="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
   </android.support.v7.widget.RecyclerView>
</RelativeLayout>

3. Header 및 Viewitem 레이아웃에 대해 서로 다른 두 가지 레이아웃 생성



여기서 우리는 두 개의 xml 레이아웃을 만듭니다. 하나는 헤더 항목용이고 다른 하나는 보기 항목용입니다.

Headerview는 헤더 항목에 표시되는 데 필요한 UI 구성 요소를 보유합니다.

헤더 항목 xml에 대한 코드는 아래와 유사해야 합니다.

activity_headeritem.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   >

   <LinearLayout
       android:id="@+id/main_dashboard"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="vertical"
       android:paddingTop="20dp">
       <LinearLayout
           android:id="@+id/counts_layout"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:orientation="vertical"
           android:paddingLeft="30dp"
           android:paddingRight="30dp"
           android:paddingBottom="30dp"
           >
           <LinearLayout
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:orientation="horizontal"
               android:weightSum="2">
               <LinearLayout
                   android:layout_width="0dp"
                   android:layout_height="wrap_content"
                   android:layout_weight="1"
                   android:orientation="vertical">

                   <TextView
                       android:id="@+id/review_needs_count_text"
                       android:layout_width="match_parent"
                       android:layout_height="wrap_content"
                       android:gravity="center"
                       android:textColor="@color/ThemePrimaryColor"
                       android:textAppearance="@style/customfontstyle"
                       android:textStyle="bold"
                       />

                   <TextView
                       android:id="@+id/review_needs_text"
                       android:layout_width="wrap_content"
                       android:layout_height="wrap_content"
                       android:layout_gravity="center_horizontal"
                       android:gravity="center_horizontal"
                       android:text="NEEDS REVIEW"
                       android:textColor="@color/disable_login_btn_bg"
                       android:textSize="11sp"
                       android:textStyle="bold"/>

               </LinearLayout>

               <LinearLayout
                   android:layout_width="0dp"
                   android:layout_height="wrap_content"
                   android:layout_weight="1"
                   android:orientation="vertical">

                   <TextView
                       android:id="@+id/planned_requests_count_text"
                       android:layout_width="match_parent"
                       android:layout_height="wrap_content"
                       android:gravity="center"
                       android:textColor="@color/ThemePrimaryColor"
                       android:textAppearance="@style/customfontstyle"
                       android:textStyle="bold"
                       />

                   <TextView
                       android:id="@+id/inprogress_text"
                       android:layout_width="wrap_content"
                       android:layout_height="wrap_content"
                       android:layout_gravity="center_horizontal"
                       android:gravity="center_horizontal"
                       android:text="PLANNED REQUESTS"
                       android:textColor="@color/disable_login_btn_bg"
                       android:textSize="11sp"
                       android:textStyle="bold"/>

               </LinearLayout>

           </LinearLayout>

           <LinearLayout
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:orientation="horizontal"
               android:layout_marginTop="10dp"
               android:weightSum="2">

               <LinearLayout
                   android:layout_width="0dp"
                   android:layout_height="wrap_content"
                   android:layout_weight="1"
                   android:orientation="vertical">

                   <TextView
                       android:id="@+id/inprogress_count_text"
                       android:layout_width="match_parent"
                       android:layout_height="wrap_content"
                       android:gravity="center"
                       android:textColor="@color/ThemePrimaryColor"
                       android:textAppearance="@style/customfontstyle"
                       android:textStyle="bold"
                       />

                   <TextView
                       android:id="@+id/completed_text"
                       android:layout_width="wrap_content"
                       android:layout_height="wrap_content"
                       android:layout_gravity="center_horizontal"
                       android:gravity="center_horizontal"
                       android:text="IN PROGRESS"
                       android:textStyle="bold"
                       android:textColor="@color/disable_login_btn_bg"
                       android:textSize="11sp" />

               </LinearLayout>

               <LinearLayout
                   android:layout_width="0dp"
                   android:layout_height="wrap_content"
                   android:layout_weight="1"
                   android:orientation="vertical">

                   <TextView
                       android:id="@+id/completed_count_text"
                       android:layout_width="match_parent"
                       android:layout_height="wrap_content"
                       android:gravity="center"
                       android:textColor="@color/ThemePrimaryColor"
                       android:textAppearance="@style/customfontstyle"
                       android:textStyle="bold"
                       />

                   <TextView
                       android:id="@+id/planned_requests_text"
                       android:layout_width="wrap_content"
                       android:layout_height="wrap_content"
                       android:layout_gravity="center_horizontal"
                       android:gravity="center_horizontal"
                       android:text="COMPLETED"
                       android:textColor="@color/disable_login_btn_bg"
                       android:textSize="11sp"
                       android:textStyle="bold"/>
               </LinearLayout>
           </LinearLayout>
       </LinearLayout>
   </LinearLayout>
</RelativeLayout>

Headerview와 유사하게 Listview Items는 보기 항목에 대한 UI 구성 요소를 보유합니다.

아래 Listview 항목에 대한 xml 코드를 첨부했습니다.

activity_listviewitem.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   >

   <LinearLayout
       android:id="@+id/latest_content_layout"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="horizontal"
       android:weightSum="2"
       android:paddingTop="15dp"
       android:paddingRight="20dp"
       android:paddingBottom="15dp"
       android:paddingLeft="5dp"
       >

       <LinearLayout
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:orientation="vertical"
           android:layout_gravity="center_horizontal"
           >

           <com.like.LikeButton
               android:id="@+id/upward_image"
               android:layout_width="40dp"
               android:layout_height="40dp"
               app:icon_size="25dp"
               app:anim_scale_factor="2"
               app:like_drawable="@drawable/arrow_up_colored"
               app:unlike_drawable="@drawable/arrow_up_icon"
               android:layout_gravity="center_horizontal"
               app:circle_start_color="@color/ThemeColor"
               app:dots_primary_color="@color/ThemeColor"
               app:dots_secondary_color="@color/ThemeColor"
               app:circle_end_color="@color/ThemeColor"/>

           <TextView
               android:id="@+id/count_upward_text"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               style="@style/UpvoteTextStyle"
               android:layout_gravity="center_horizontal"
               />

       </LinearLayout>

       <LinearLayout
           android:id="@+id/latest_feed_layout"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:orientation="vertical"
           android:layout_marginTop="5dp"
           android:layout_marginLeft="5dp"
           android:layout_weight="1.8">

           <TextView
               android:id="@+id/latest_tab_title_text"
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               style="@style/TitletextStyle"
               />

           <TextView
               android:id="@+id/latest_tab_descrip_text"
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:maxLines="3"
               style="@style/DescriptiontextStyle"
               />

           <LinearLayout
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:orientation="horizontal"
               android:layout_marginTop="5dp">

               <TextView
                   android:id="@+id/comment_count_text"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   style="@style/CommentstextStyle"
                   />

               <TextView
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:text="@string/comments_text"
                   style="@style/CommentstextStyle"
                   />

               <TextView
                   android:id="@+id/latest_tab_status_text"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   style="@style/StatusTextStyle"
                   android:textColor="@color/inprogress_status_color"/>
           </LinearLayout>
       </LinearLayout>
   </LinearLayout>
</RelativeLayout>

4. 커스텀어댑터클래스.자바



viewtype 속성을 사용하여 헤더 항목을 recyclerview에 추가했습니다. 이제 Recyclerview용 맞춤 어댑터를 만들겠습니다. onCreateViewHolder 방법에서 우리는 layout.xml을 정의하는 데 도움이 되는 두 가지 확장 방법을 사용해야 합니다. viewtype 속성을 따르는 "RecyclerView.Adapter"로 어댑터를 확장해야 합니다.

CustomAdapter.java

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

   private static final int TYPE_HEADER = 0;
   private static final int TYPE_ITEM = 1;

   private List<ViewItemsModel> viewitemlists;
   private Context context;

   public CustomAdapter(Context context, List<ViewItemsModel> viewitemlists) {
       this.context = context;
       this.viewitemlists = viewitemlists;
   }

   @Override
   public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
       if (viewType == TYPE_ITEM) {
           // Here Inflating your recyclerview item layout
           View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_listviewitem, parent, false);
           return new ItemViewHolder(itemView);
       } else if (viewType == TYPE_HEADER) {
           // Here Inflating your header view
           View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_headeritem, parent, false);
           return new HeaderViewHolder(itemView);
       }
       else return null;
   }

   @Override
   public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {

       if (holder instanceof HeaderViewHolder){
           setheadersdata_flag = true;
           HeaderViewHolder headerViewHolder = (HeaderViewHolder) holder;

           // You have to set your header items values with the help of model class and you can modify as per your needs

            headerViewHolder.txt_needsreview.setText(YOUR _HEADERVIEW_STRING);

        }
       else if (holder instanceof ItemViewHolder){

           final ItemViewHolder itemViewHolder = (ItemViewHolder) holder;

           // Following code give a row of header and decrease the one position from listview items
           final LatestTabModel.ViewItemsModel data = latestlists.get(position-1);

           // You have to set your listview items values with the help of model class and you can modify as per your needs

           itemViewHolder.title.setText(data.getTitle());

       }
   }

   @Override
   public int getItemViewType(int position) {
       if (position == 0) {
           return TYPE_HEADER;
       }
       return TYPE_ITEM;
   }


// getItemCount increasing the position to 1. This will be the row of header
   @Override
   public int getItemCount() {
       return latestlists.size()+1;
   }


 private class HeaderViewHolder extends RecyclerView.ViewHolder {
       TextView txt_needsreview,txt_planned,txt_inprogress,txt_completed;

       public HeaderViewHolder(View view) {
           super(view);
           txt_needsreview = (TextView) view.findViewById(R.id.review_needs_count_text);
           txt_planned = (TextView) view.findViewById(R.id.planned_requests_count_text);
           txt_inprogress = (TextView) view.findViewById(R.id.inprogress_count_text);
           txt_completed = (TextView) view.findViewById(R.id.completed_count_text);
       }
   }

   public class ItemViewHolder extends RecyclerView.ViewHolder {

       TextView title,description,upward_count,comment_count,status;
       LinearLayout latest_feed_layout;
       LikeButton upvote_image;
      public ItemViewHolder(View itemView) {
           super(itemView);

           title = (TextView) itemView.findViewById(R.id.latest_tab_title_text);
           description = (TextView) itemView.findViewById(R.id.latest_tab_descrip_text);
           upward_count = (TextView) itemView.findViewById(R.id.count_upward_text);
           comment_count = (TextView) itemView.findViewById(R.id.comment_count_text);
           status = (TextView) itemView.findViewById(R.id.latest_tab_status_text);
           latest_feed_layout = (LinearLayout)                     itemView.findViewById(R.id.latest_feed_layout);
           upvote_image = (LikeButton) itemView.findViewById(R.id.upward_image);

       }
   }
  }

getItemViewType()은 Recyclerview를 스크롤하는 데 도움이 되는 viewtype 속성을 Recyclerview에 제공합니다.

getItemCount()는 목록 항목 위치를 1씩 증가시킵니다(listitem + 1). 헤더 아래에 행을 제공합니다.

5. 메인액티비티.자바



이 클래스에서는 스크롤 기능을 완성하기 위해 Recyclerview의 어댑터 클래스를 전달해야 합니다. 마지막으로 헤더 뷰를 통해 Recyclerview의 완전한 기능을 구현합니다.

MainActivity.java

public class MainActivity extends AppCompatActivity {

   RecyclerView recyclerView;
   LinearLayoutManager linearLayoutManager;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       recyclerView = (RecyclerView)findViewById(R.id.my_recycler_view);
       linearLayoutManager = new LinearLayoutManager(this);
       MyRecyclerAdapter adapter = new MyRecyclerAdapter(getActivity(), getListViewItems());
       recyclerView.setLayoutManager(linearLayoutManager);
       recyclerView.setAdapter(adapter);
   }
}

이것으로 이 튜토리얼을 마칩니다. Android 앱용 recyclerview를 만드는 방법을 배웠기를 바랍니다. 이제 안드로이드 장치에서 이것을 실행하고 출력을 직접 볼 수 있습니다. 이 출력은 정확히 원하는 것 같습니다.

좋은 웹페이지 즐겨찾기