Step: 1 ======
Create two Model Classes like below.
SingleItemModel.java 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 package com. pratap . gplaystore . models ; /** * Created by pratap.kesaboyina on 01-12-2015. */ public class SingleItemModel { private String name; private String url; private String description; public SingleItemModel () { } public SingleItemModel ( String name, String url) { this . name = name; this . url = url; } public String getUrl () { return url; } public void setUrl ( String url) { this . url = url; } public String getName () { return name; } public void setName ( String name) { this . name = name; } public String getDescription () { return description; } public void setDescription ( String description) { this . description = description; } }
SectionDataModel.java 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 32 33 34 35 36 37 38 39 40 41 42 43 package com. pratap . gplaystore . models ; import java.util.ArrayList ; /** * Created by pratap.kesaboyina on 30-11-2015. */ public class SectionDataModel { private String headerTitle; private ArrayList< SingleItemModel> allItemsInSection; public SectionDataModel () { } public SectionDataModel ( String headerTitle, ArrayList< SingleItemModel> allItemsInSection) { this . headerTitle = headerTitle; this . allItemsInSection = allItemsInSection; } public String getHeaderTitle () { return headerTitle; } public void setHeaderTitle ( String headerTitle) { this . headerTitle = headerTitle; } public ArrayList< SingleItemModel> getAllItemsInSection () { return allItemsInSection; } public void setAllItemsInSection ( ArrayList< SingleItemModel> allItemsInSection) { this . allItemsInSection = allItemsInSection; } }
Step: 2 ======
Create an Activity with RecyclerView to show the list in vertical order.
MainActivity.java 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 package com. pratap . gplaystore ; import android.os.Bundle ; import android.support.v7.app.AppCompatActivity ; import android.support.v7.widget.LinearLayoutManager ; import android.support.v7.widget.RecyclerView ; import android.support.v7.widget.Toolbar ; import com.pratap.gplaystore.adapters.RecyclerViewDataAdapter ; import com.pratap.gplaystore.models.SectionDataModel ; import com.pratap.gplaystore.models.SingleItemModel ; import java.util.ArrayList ; public class MainActivity extends AppCompatActivity { private Toolbar toolbar; ArrayList< SectionDataModel> allSampleData; @Override protected void onCreate ( Bundle savedInstanceState) { super . onCreate ( savedInstanceState); setContentView( R. layout . activity_main ); toolbar = ( Toolbar) findViewById( R. id . toolbar ); allSampleData = new ArrayList< SectionDataModel>(); if ( toolbar != null ) { setSupportActionBar( toolbar); toolbar. setTitle ( "G PlayStore" ); } createDummyData(); RecyclerView my_recycler_view = ( RecyclerView) findViewById( R. id . my_recycler_view ); my_recycler_view. setHasFixedSize ( true ); RecyclerViewDataAdapter adapter = new RecyclerViewDataAdapter( this , allSampleData); my_recycler_view. setLayoutManager ( new LinearLayoutManager( this , LinearLayoutManager. VERTICAL , false )); my_recycler_view. setAdapter ( adapter); } public void createDummyData () { for ( int i = 1 ; i <= 5 ; i++) { SectionDataModel dm = new SectionDataModel(); dm. setHeaderTitle ( "Section " + i); ArrayList< SingleItemModel> singleItem = new ArrayList< SingleItemModel>(); for ( int j = 0 ; j <= 5 ; j++) { singleItem. add ( new SingleItemModel( "Item " + j, "URL " + j)); } dm. setAllItemsInSection ( singleItem); allSampleData. add ( dm); } } }
Create an XML Layout for the above activity class
activity_main.xml 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 <?xml version="1.0" encoding="utf-8"?> <LinearLayout 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= "match_parent" android:orientation= "vertical" > <android.support.v7.widget.Toolbar android:id= "@+id/toolbar" android:layout_width= "match_parent" android:layout_height= "?attr/actionBarSize" android:background= "?attr/colorPrimary" android:elevation= "8dp" android:theme= "@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:popupTheme= "@style/ThemeOverlay.AppCompat.Light" /> <android.support.v7.widget.RecyclerView android:id= "@+id/my_recycler_view" android:layout_width= "match_parent" android:layout_height= "match_parent" android:scrollbars= "none" /> </LinearLayout>
Step: 3 ======
Now Create an Adapter Class for the recyclerView in the MainActivity.
RecyclerViewDataAdapter.java 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 package com. pratap . gplaystore . adapters ; /** * Created by pratap.kesaboyina on 24-12-2014. */ import android.content.Context ; import android.support.v7.widget.LinearLayoutManager ; import android.support.v7.widget.RecyclerView ; import android.view.LayoutInflater ; import android.view.View ; import android.view.ViewGroup ; import android.widget.Button ; import android.widget.TextView ; import android.widget.Toast ; import com.pratap.gplaystore.R ; import com.pratap.gplaystore.models.SectionDataModel ; import java.util.ArrayList ; public class RecyclerViewDataAdapter extends RecyclerView. Adapter < RecyclerViewDataAdapter. ItemRowHolder > { private ArrayList< SectionDataModel> dataList; private Context mContext; public RecyclerViewDataAdapter ( Context context, ArrayList< SectionDataModel> dataList) { this . dataList = dataList; this . mContext = context; } @Override public ItemRowHolder onCreateViewHolder ( ViewGroup viewGroup, int i) { View v = LayoutInflater. from ( viewGroup. getContext ()). inflate ( R. layout . list_item , null ); ItemRowHolder mh = new ItemRowHolder( v); return mh; } @Override public void onBindViewHolder ( ItemRowHolder itemRowHolder, int i) { final String sectionName = dataList. get ( i). getHeaderTitle (); ArrayList singleSectionItems = dataList. get ( i). getAllItemsInSection (); itemRowHolder. itemTitle . setText ( sectionName); SectionListDataAdapter itemListDataAdapter = new SectionListDataAdapter( mContext, singleSectionItems); itemRowHolder. recycler_view_list . setHasFixedSize ( true ); itemRowHolder. recycler_view_list . setLayoutManager ( new LinearLayoutManager( mContext, LinearLayoutManager. HORIZONTAL , false )); itemRowHolder. recycler_view_list . setAdapter ( itemListDataAdapter); itemRowHolder. btnMore . setOnClickListener ( new View. OnClickListener () { @Override public void onClick ( View v) { Toast. makeText ( v. getContext (), "click event on more, " + sectionName , Toast. LENGTH_SHORT ). show (); } }); /* Glide.with(mContext) .load(feedItem.getImageURL()) .diskCacheStrategy(DiskCacheStrategy.ALL) .centerCrop() .error(R.drawable.bg) .into(feedListRowHolder.thumbView);*/ } @Override public int getItemCount () { return ( null != dataList ? dataList. size () : 0 ); } public class ItemRowHolder extends RecyclerView. ViewHolder { protected TextView itemTitle; protected RecyclerView recycler_view_list; protected Button btnMore; public ItemRowHolder ( View view) { super ( view); this . itemTitle = ( TextView) view. findViewById ( R. id . itemTitle ); this . recycler_view_list = ( RecyclerView) view. findViewById ( R. id . recycler_view_list ); this . btnMore = ( Button) view. findViewById ( R. id . btnMore ); } } }
Now create an xml Layout file for the above adapter class.
list_item.xml 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 <? xml version= "1.0" encoding= "utf-8" ?> < LinearLayout xmlns: android= "http://schemas.android.com/apk/res/android" android: layout_width= "match_parent" android: layout_height= "wrap_content" android: background= "?android:selectableItemBackground" android: orientation= "vertical" android: padding= "5dp" > < RelativeLayout android: layout_width= "match_parent" android: layout_height= "wrap_content" android: padding= "2dp" > < TextView android: id= "@+id/itemTitle" android: layout_width= "wrap_content" android: layout_height= "wrap_content" android: layout_alignParentLeft= "true" android: layout_alignParentStart= "true" android: layout_centerVertical= "true" android: layout_gravity= "center_vertical" android: layout_toLeftOf= "@+id/btnMore" android: text= "Sample title" android: textColor= "@android:color/black" android: textSize= "18sp" /> < Button android: id= "@+id/btnMore" android: layout_width= "wrap_content" android: layout_height= "42dp" android: layout_alignParentEnd= "true" android: layout_alignParentRight= "true" android: layout_centerVertical= "true" android: theme= "@style/MyButton" android: text= "more" android: textColor= "#FFF" /> </ RelativeLayout> < android. support . v7 . widget . RecyclerView android: id= "@+id/recycler_view_list" android: layout_width= "match_parent" android: layout_height= "160dp" android: layout_gravity= "center_vertical" android: orientation= "horizontal" /> </ LinearLayout>
Step: 4 ======
Now , In order to make a horizontal RecyclerView , we need create a layout and Adapter class for each row.
list_single_card.xml 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 32 33 34 35 36 37 38 39 40 41 <? xml version= "1.0" encoding= "utf-8" ?> < android. support . v7 . widget . CardView 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" android: orientation= "horizontal" app: cardCornerRadius= "5dp" app: cardUseCompatPadding= "true" > < LinearLayout android: layout_width= "match_parent" android: layout_height= "wrap_content" android: padding= "0dp" android: background= "?android:selectableItemBackground" android: orientation= "vertical" > < ImageView android: id= "@+id/itemImage" android: layout_width= "100dp" android: layout_height= "100dp" android: layout_gravity= "center_horizontal" android: scaleType= "fitCenter" android: src= "@drawable/android" /> < TextView android: id= "@+id/tvTitle" android: layout_width= "match_parent" android: layout_height= "wrap_content" android: layout_below= "@id/itemImage" android: gravity= "center" android: padding= "5dp" android: text= "Sample title" android: textColor= "@android:color/black" android: textSize= "18sp" /> </ LinearLayout> </ android. support . v7 . widget . CardView >
The Adapter Class for Horizontal RecyclerView
SectionListDataAdapter.java 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 package com. pratap . gplaystore . adapters ; /** * Created by pratap.kesaboyina on 24-12-2014. */ import android.content.Context ; import android.support.v7.widget.RecyclerView ; import android.view.LayoutInflater ; import android.view.View ; import android.view.ViewGroup ; import android.widget.ImageView ; import android.widget.TextView ; import android.widget.Toast ; import com.pratap.gplaystore.R ; import com.pratap.gplaystore.models.SingleItemModel ; import java.util.ArrayList ; public class SectionListDataAdapter extends RecyclerView. Adapter < SectionListDataAdapter. SingleItemRowHolder > { private ArrayList< SingleItemModel> itemsList; private Context mContext; public SectionListDataAdapter ( Context context, ArrayList< SingleItemModel> itemsList) { this . itemsList = itemsList; this . mContext = context; } @Override public SingleItemRowHolder onCreateViewHolder ( ViewGroup viewGroup, int i) { View v = LayoutInflater. from ( viewGroup. getContext ()). inflate ( R. layout . list_single_card , null ); SingleItemRowHolder mh = new SingleItemRowHolder( v); return mh; } @Override public void onBindViewHolder ( SingleItemRowHolder holder, int i) { SingleItemModel singleItem = itemsList. get ( i); holder. tvTitle . setText ( singleItem. getName ()); /* Glide.with(mContext) .load(feedItem.getImageURL()) .diskCacheStrategy(DiskCacheStrategy.ALL) .centerCrop() .error(R.drawable.bg) .into(feedListRowHolder.thumbView);*/ } @Override public int getItemCount () { return ( null != itemsList ? itemsList. size () : 0 ); } public class SingleItemRowHolder extends RecyclerView. ViewHolder { protected TextView tvTitle; protected ImageView itemImage; public SingleItemRowHolder ( View view) { super ( view); this . tvTitle = ( TextView) view. findViewById ( R. id . tvTitle ); this . itemImage = ( ImageView) view. findViewById ( R. id . itemImage ); view. setOnClickListener ( new View. OnClickListener () { @Override public void onClick ( View v) { Toast. makeText ( v. getContext (), tvTitle. getText (), Toast. LENGTH_SHORT ). show (); } }); } } }
ScreenShots =========
Source code ========
DropBox Link Demo ========
VIDEO
Comments
Post a Comment