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
========
hi,
ReplyDeletePlease provide search option in above given tutorial.
Please, how do I load images from url into this code?
ReplyDelete