Sectioned RecyclerView in android
Created a sample Sectioned RecyclerView Application.
I used the following Library to easily create this one.
https://github.com/afollestad/sectioned-recyclerview
Credits:Aidan Follestad
Step: 1
======
Add a dependency to the build.gradle file [or] You can download the SectionedRecyclerViewAdapter.java file and put in it your source code.
compile('com.github.afollestad:sectioned-recyclerview:0.1.0') {
transitive = true
}
Step: 2
======
Created a Sample Activity with RecyclerView in the Xml Layout file. Populated with dummy data for sample.
package com.pratap.sectionrecyclerview;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import com.pratap.sectionrecyclerview.models.DataModel;
import com.pratap.sectionrecyclerview.utils.DividerItemDecoration;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private Toolbar toolbar;
List<DataModel> allSampleData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
allSampleData = new ArrayList<DataModel>();
if (toolbar != null) {
setSupportActionBar(toolbar);
toolbar.setTitle("Section RecyclerView");
}
populateSampleData();
RecyclerView my_recycler_view = (RecyclerView) findViewById(R.id.my_recycler_view);
my_recycler_view.addItemDecoration(
new DividerItemDecoration(this, null));
RecyclerViewSectionAdapter adapter = new RecyclerViewSectionAdapter(allSampleData);
GridLayoutManager manager = new GridLayoutManager(this,
getResources().getInteger(R.integer.grid_span_1));
/* GridLayoutManager manager = new GridLayoutManager(this,
getResources().getInteger(R.integer.grid_span_2));
GridLayoutManager manager = new GridLayoutManager(this,
getResources().getInteger(R.integer.grid_span_3));*/
my_recycler_view.setLayoutManager(manager);
adapter.setLayoutManager(manager);
my_recycler_view.setAdapter(adapter);
}
private void populateSampleData() {
for (int i = 1; i <= 10; i++) {
DataModel dm = new DataModel();
dm.setHeaderTitle("Section " + i);
ArrayList<String> singleItem = new ArrayList<>();
for (int j = 1; j <= 4; j++) {
singleItem.add("Item " + j);
}
dm.setAllItemsInSection(singleItem);
allSampleData.add(dm);
}
}
}
Step: 3
======
Created a Adapter which extends from SectionedRecyclerViewAdapter Class provided in the Library.
package com.pratap.sectionrecyclerview;
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.sectionrecyclerview.models.DataModel;
import com.pratap.sectionrecyclerview.utils.SectionedRecyclerViewAdapter;
import java.util.ArrayList;
import java.util.List;
public class RecyclerViewSectionAdapter extends SectionedRecyclerViewAdapter<RecyclerView.ViewHolder> {
private List<DataModel> allData;
public RecyclerViewSectionAdapter(List<DataModel> data) {
this.allData = data;
}
@Override
public int getSectionCount() {
return allData.size();
}
@Override
public int getItemCount(int section) {
return allData.get(section).getAllItemsInSection().size();
}
@Override
public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder, int section) {
String sectionName = allData.get(section).getHeaderTitle();
SectionViewHolder sectionViewHolder = (SectionViewHolder) holder;
sectionViewHolder.sectionTitle.setText(sectionName);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int section, int relativePosition, int absolutePosition) {
ArrayList<String> itemsInSection = allData.get(section).getAllItemsInSection();
String itemName = itemsInSection.get(relativePosition);
ItemViewHolder itemViewHolder = (ItemViewHolder) holder;
itemViewHolder.itemTitle.setText(itemName);
// Try to put a image . for sample i set background color in xml layout file
// itemViewHolder.itemImage.setBackgroundColor(Color.parseColor("#01579b"));
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, boolean header) {
View v = null;
if (header)
{
v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item_section, parent, false);
return new SectionViewHolder(v);
} else {
v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
return new ItemViewHolder(v);
}
}
// SectionViewHolder Class for Sections
public static class SectionViewHolder extends RecyclerView.ViewHolder {
final TextView sectionTitle;
public SectionViewHolder(View itemView) {
super(itemView);
sectionTitle = (TextView) itemView.findViewById(R.id.sectionTitle);
}
}
// ItemViewHolder Class for Items in each Section
public static class ItemViewHolder extends RecyclerView.ViewHolder {
final TextView itemTitle;
final ImageView itemImage;
public ItemViewHolder(View itemView) {
super(itemView);
itemTitle = (TextView) itemView.findViewById(R.id.itemTitle);
itemImage = (ImageView) itemView.findViewById(R.id.itemImage);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), itemTitle.getText(), Toast.LENGTH_SHORT).show();
}
});
}
}
}
Step: 4
======
Create a Model class to provide for the Adapter
package com.pratap.sectionrecyclerview.models;
import java.util.ArrayList;
/**
* Created by pratap.kesaboyina on 30-11-2015.
*/
public class DataModel {
private String headerTitle;
private ArrayList<String> allItemsInSection;
public DataModel() {
}
public DataModel(String headerTitle, ArrayList<String> allItemsInSection) {
this.headerTitle = headerTitle;
this.allItemsInSection = allItemsInSection;
}
public String getHeaderTitle() {
return headerTitle;
}
public void setHeaderTitle(String headerTitle) {
this.headerTitle = headerTitle;
}
public ArrayList<String> getAllItemsInSection() {
return allItemsInSection;
}
public void setAllItemsInSection(ArrayList<String> allItemsInSection) {
this.allItemsInSection = allItemsInSection;
}
}
ScreenShots
=========
Demo
=====
Source Code
=========
DropBoxLink
No comments:
Post a Comment