Skip to content

Commit 758181b

Browse files
committed
Merge pull request #9 from brianwernick/header_columns
Header columns
2 parents 7ba7dfd + a42101f commit 758181b

23 files changed

+402
-50
lines changed

demo/src/main/java/com/devbrackets/android/recyclerextdemo/data/Example.java

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
public enum Example {
88
CURSOR("Cursor"),
99
HEADER_LIST("Header List"),
10+
HEADER_AS_CHILD_LIST("Contacts Header List"),
1011
REORDER_LIST_HORIZONTAL("Reorder List Horizontal"),
1112
REORDER_LIST_VERTICAL("Reorder List Vertical"),
1213
REORDER_CURSOR_VERTICAL("Reorder Cursor Vertical");

demo/src/main/java/com/devbrackets/android/recyclerextdemo/ui/activity/MainActivity.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public class MainActivity extends Activity {
2525
@Override
2626
protected void onCreate(Bundle savedInstanceState) {
2727
super.onCreate(savedInstanceState);
28-
setContentView(R.layout.main_activity);
28+
setContentView(R.layout.activity_main);
2929

3030
recyclerView = (RecyclerView) findViewById(R.id.main_activity_recycler);
3131
setupRecyclerExt();
@@ -65,8 +65,7 @@ public ListAdapter(Context context) {
6565

6666
@Override
6767
public SimpleTextViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
68-
View view = inflater.inflate(R.layout.simple_text_item, null);
69-
return new SimpleTextViewHolder(view);
68+
return SimpleTextViewHolder.newInstance(inflater, parent);
7069
}
7170

7271
@Override

demo/src/main/java/com/devbrackets/android/recyclerextdemo/ui/activity/SingleFragmentActivity.java

+11-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.devbrackets.android.recyclerextdemo.R;
88
import com.devbrackets.android.recyclerextdemo.data.Example;
99
import com.devbrackets.android.recyclerextdemo.ui.fragment.CursorFragment;
10+
import com.devbrackets.android.recyclerextdemo.ui.fragment.HeaderAsChildListFragment;
1011
import com.devbrackets.android.recyclerextdemo.ui.fragment.HeaderListFragment;
1112
import com.devbrackets.android.recyclerextdemo.ui.fragment.ReorderCursorFragment;
1213
import com.devbrackets.android.recyclerextdemo.ui.fragment.ReorderListFragment;
@@ -21,7 +22,7 @@ public class SingleFragmentActivity extends FragmentActivity {
2122
@Override
2223
protected void onCreate(Bundle savedInstanceState) {
2324
super.onCreate(savedInstanceState);
24-
setContentView(R.layout.single_fragment_activity);
25+
setContentView(R.layout.activity_single_fragment);
2526
}
2627

2728
@Override
@@ -56,6 +57,10 @@ protected void onResume() {
5657
case HEADER_LIST:
5758
pushHeaderListFragment();
5859
break;
60+
61+
case HEADER_AS_CHILD_LIST:
62+
pushHeaderAsChildListFragment();
63+
break;
5964
}
6065
}
6166

@@ -83,4 +88,9 @@ private void pushHeaderListFragment() {
8388
Fragment fragment = HeaderListFragment.newInstance();
8489
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
8590
}
91+
92+
private void pushHeaderAsChildListFragment() {
93+
Fragment fragment = HeaderAsChildListFragment.newInstance();
94+
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
95+
}
8696
}

demo/src/main/java/com/devbrackets/android/recyclerextdemo/ui/fragment/CursorFragment.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public static CursorFragment newInstance() {
3030

3131
@Override
3232
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
33-
View view = inflater.inflate(R.layout.recycler_fragment, container, false);
33+
View view = inflater.inflate(R.layout.fragment_recycler, container, false);
3434
recyclerView = (RecyclerView)view.findViewById(R.id.recyclerext_fragment_recycler);
3535
return view;
3636
}
@@ -69,8 +69,7 @@ public CursorAdapter(Context context, Cursor cursor) {
6969

7070
@Override
7171
public SimpleTextViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
72-
View view = inflater.inflate(R.layout.simple_text_item, parent, false);
73-
return new SimpleTextViewHolder(view);
72+
return SimpleTextViewHolder.newInstance(inflater, parent);
7473
}
7574

7675
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
package com.devbrackets.android.recyclerextdemo.ui.fragment;
2+
3+
import android.content.Context;
4+
import android.os.Bundle;
5+
import android.support.v4.app.Fragment;
6+
import android.support.v7.widget.LinearLayoutManager;
7+
import android.support.v7.widget.RecyclerView;
8+
import android.view.LayoutInflater;
9+
import android.view.View;
10+
import android.view.ViewGroup;
11+
12+
import com.devbrackets.android.recyclerext.adapter.RecyclerHeaderAdapter;
13+
import com.devbrackets.android.recyclerext.decoration.StickyHeaderDecoration;
14+
import com.devbrackets.android.recyclerextdemo.R;
15+
import com.devbrackets.android.recyclerextdemo.data.database.DBHelper;
16+
import com.devbrackets.android.recyclerextdemo.data.database.ItemDAO;
17+
import com.devbrackets.android.recyclerextdemo.ui.viewholder.ContactsHeaderViewHolder;
18+
import com.devbrackets.android.recyclerextdemo.ui.viewholder.SimpleTextViewHolder;
19+
20+
import java.util.List;
21+
22+
23+
/**
24+
* An example of the {@link HeaderAsChildListFragment.HeaderAdapter}
25+
* that has the display style of the Lollipop and Marshmallow Contacts app
26+
* using the {@link StickyHeaderDecoration} to keep the header at the top of the screen when reached.
27+
*/
28+
public class HeaderAsChildListFragment extends Fragment {
29+
private DBHelper dbHelper;
30+
private RecyclerView recyclerView;
31+
32+
public static HeaderAsChildListFragment newInstance() {
33+
return new HeaderAsChildListFragment();
34+
}
35+
36+
@Override
37+
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
38+
View view = inflater.inflate(R.layout.fragment_recycler, container, false);
39+
recyclerView = (RecyclerView)view.findViewById(R.id.recyclerext_fragment_recycler);
40+
return view;
41+
}
42+
43+
@Override
44+
public void onActivityCreated(Bundle savedInstanceState) {
45+
super.onActivityCreated(savedInstanceState);
46+
47+
//Makes sure the database is initialized and open for use
48+
dbHelper = new DBHelper(getActivity());
49+
setupRecyclerExt();
50+
}
51+
52+
/**
53+
* Retrieves the items from the database, and sets the layout manager, adapter, and sticky decoration
54+
* on the RecyclerView.
55+
*/
56+
private void setupRecyclerExt() {
57+
HeaderAdapter adapter = new HeaderAdapter(getActivity(), ItemDAO.findAll(dbHelper.getWritableDatabase()));
58+
59+
recyclerView.setAdapter(adapter);
60+
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
61+
62+
//OPTIONAL: The StickyHeaderDecoration is used to keep the current header always visible
63+
recyclerView.addItemDecoration(new StickyHeaderDecoration(recyclerView));
64+
}
65+
66+
/**
67+
* The adapter that extends the {@link RecyclerHeaderAdapter} to provide the
68+
* minimum number of methods to function
69+
*/
70+
private class HeaderAdapter extends RecyclerHeaderAdapter<ContactsHeaderViewHolder, SimpleTextViewHolder> {
71+
private LayoutInflater inflater;
72+
private List<ItemDAO> items;
73+
74+
public HeaderAdapter(Context context, List<ItemDAO> items) {
75+
this.items = items;
76+
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
77+
78+
//This is the call that makes the adapter treat the headers position as a child
79+
// e.g. CHILD(position=9, getItem(9)), HEADER(position=10, getItem(10)), CHILD(position=11, getItem(11))
80+
// whereas normally the header doesn't interfere with the child items
81+
// e.g. CHILD(position=9, getItem(9)), HEADER(position=10, getItem(10)), CHILD(position=11, getItem(10))
82+
showHeaderAsChild(true);
83+
}
84+
85+
@Override
86+
public ContactsHeaderViewHolder onCreateHeaderViewHolder(ViewGroup parent, int viewType) {
87+
return ContactsHeaderViewHolder.newInstance(inflater, parent);
88+
}
89+
90+
@Override
91+
public SimpleTextViewHolder onCreateChildViewHolder(ViewGroup parent, int viewType) {
92+
return SimpleTextViewHolder.newInstance(inflater, parent);
93+
}
94+
95+
@Override
96+
public void onBindHeaderViewHolder(ContactsHeaderViewHolder holder, int childPosition) {
97+
ItemDAO item = items.get(childPosition);
98+
99+
holder.setText(item.getText());
100+
holder.setRegionText(childPosition / 10 + "");
101+
}
102+
103+
@Override
104+
public void onBindChildViewHolder(SimpleTextViewHolder holder, int childPosition) {
105+
holder.setText(items.get(childPosition).getText());
106+
holder.setSpacingVisible(true);
107+
}
108+
109+
@Override
110+
public int getChildCount() {
111+
return items.size();
112+
}
113+
114+
/**
115+
* For simplicity sake, we just return a simple mathematical id for the headers.
116+
* You should provide an actual id.
117+
*/
118+
@Override
119+
public long getHeaderId(int childPosition) {
120+
return items.get(childPosition).getOrder() / 10;
121+
}
122+
123+
/**
124+
* Specifying this will make only the number field from the header be sticky
125+
*/
126+
@Override
127+
public int getCustomStickyHeaderViewId() {
128+
return R.id.contacts_header_item_region_text_view;
129+
}
130+
}
131+
}

demo/src/main/java/com/devbrackets/android/recyclerextdemo/ui/fragment/HeaderListFragment.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public static HeaderListFragment newInstance() {
3333

3434
@Override
3535
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
36-
View view = inflater.inflate(R.layout.recycler_fragment, container, false);
36+
View view = inflater.inflate(R.layout.fragment_recycler, container, false);
3737
recyclerView = (RecyclerView)view.findViewById(R.id.recyclerext_fragment_recycler);
3838
return view;
3939
}
@@ -76,14 +76,12 @@ public HeaderAdapter(Context context, List<ItemDAO> items) {
7676

7777
@Override
7878
public SimpleTextViewHolder onCreateHeaderViewHolder(ViewGroup parent, int viewType) {
79-
View view = inflater.inflate(R.layout.simple_text_item, parent, false);
80-
return new SimpleTextViewHolder(view);
79+
return SimpleTextViewHolder.newInstance(inflater, parent);
8180
}
8281

8382
@Override
8483
public SimpleTextViewHolder onCreateChildViewHolder(ViewGroup parent, int viewType) {
85-
View view = inflater.inflate(R.layout.simple_text_item, parent, false);
86-
return new SimpleTextViewHolder(view);
84+
return SimpleTextViewHolder.newInstance(inflater, parent);
8785
}
8886

8987
@Override

demo/src/main/java/com/devbrackets/android/recyclerextdemo/ui/fragment/ReorderCursorFragment.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public static ReorderCursorFragment newInstance() {
3636

3737
@Override
3838
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
39-
View view = inflater.inflate(R.layout.recycler_fragment, container, false);
39+
View view = inflater.inflate(R.layout.fragment_recycler, container, false);
4040
recyclerView = (RecyclerView)view.findViewById(R.id.recyclerext_fragment_recycler);
4141
return view;
4242
}
@@ -117,8 +117,7 @@ public RRReorderCursorAdapter(Context context, Cursor cursor) {
117117

118118
@Override
119119
public SimpleDragItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
120-
View view = inflater.inflate(R.layout.simple_drag_item, parent, false);
121-
return new SimpleDragItemViewHolder(view);
120+
return SimpleDragItemViewHolder.newInstance(inflater, parent);
122121
}
123122

124123
@Override

demo/src/main/java/com/devbrackets/android/recyclerextdemo/ui/fragment/ReorderListFragment.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public static ReorderListFragment newInstance() {
3030

3131
@Override
3232
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
33-
View view = inflater.inflate(R.layout.recycler_fragment, container, false);
33+
View view = inflater.inflate(R.layout.fragment_recycler, container, false);
3434

3535
recyclerView = (RecyclerView)view.findViewById(R.id.recyclerext_fragment_recycler);
3636
setupRecyclerExt();
@@ -98,9 +98,7 @@ public ListAdapter(Context context) {
9898

9999
@Override
100100
public SimpleDragItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
101-
View view = inflater.inflate(R.layout.simple_drag_item, parent, false);
102-
103-
return new SimpleDragItemViewHolder(view);
101+
return SimpleDragItemViewHolder.newInstance(inflater, parent);
104102
}
105103

106104
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.devbrackets.android.recyclerextdemo.ui.viewholder;
2+
3+
import android.support.v7.widget.RecyclerView;
4+
import android.view.LayoutInflater;
5+
import android.view.View;
6+
import android.view.ViewGroup;
7+
import android.widget.TextView;
8+
9+
import com.devbrackets.android.recyclerextdemo.R;
10+
11+
/**
12+
* A ViewHolder for the list_item_contacts_header layout
13+
*/
14+
public class ContactsHeaderViewHolder extends RecyclerView.ViewHolder {
15+
private TextView textView;
16+
private TextView regionTextView;
17+
18+
public static ContactsHeaderViewHolder newInstance(LayoutInflater inflater, ViewGroup parent) {
19+
View view = inflater.inflate(R.layout.list_item_contacts_header, parent, false);
20+
return new ContactsHeaderViewHolder(view);
21+
}
22+
23+
public ContactsHeaderViewHolder(View itemView) {
24+
super(itemView);
25+
26+
textView = (TextView)itemView.findViewById(R.id.contacts_header_item_text_view);
27+
regionTextView = (TextView)itemView.findViewById(R.id.contacts_header_item_region_text_view);
28+
}
29+
30+
public void setText(String text) {
31+
textView.setText(text);
32+
}
33+
34+
public void setRegionText(String text) {
35+
regionTextView.setText(text);
36+
}
37+
}

demo/src/main/java/com/devbrackets/android/recyclerextdemo/ui/viewholder/SimpleDragItemViewHolder.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
11
package com.devbrackets.android.recyclerextdemo.ui.viewholder;
22

33
import android.support.v7.widget.RecyclerView;
4+
import android.view.LayoutInflater;
45
import android.view.View;
6+
import android.view.ViewGroup;
57
import android.widget.TextView;
68

79
import com.devbrackets.android.recyclerextdemo.R;
810

911
/**
10-
* A ViewHolder for the simple_text_item layout
12+
* A ViewHolder for the list_item_simple_text layout
1113
*/
1214
public class SimpleDragItemViewHolder extends RecyclerView.ViewHolder {
1315
private TextView textView;
1416

17+
public static SimpleDragItemViewHolder newInstance(LayoutInflater inflater, ViewGroup parent) {
18+
View view = inflater.inflate(R.layout.list_item_simple_drag, parent, false);
19+
return new SimpleDragItemViewHolder(view);
20+
}
21+
1522
public SimpleDragItemViewHolder(View itemView) {
1623
super(itemView);
1724

demo/src/main/java/com/devbrackets/android/recyclerextdemo/ui/viewholder/SimpleTextViewHolder.java

+14-1
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,30 @@
22

33
import android.support.annotation.ColorInt;
44
import android.support.v7.widget.RecyclerView;
5+
import android.view.LayoutInflater;
56
import android.view.View;
7+
import android.view.ViewGroup;
68
import android.widget.TextView;
79

810
import com.devbrackets.android.recyclerextdemo.R;
911

1012
/**
11-
* A ViewHolder for the simple_text_item layout
13+
* A ViewHolder for the list_item_simple_text layout
1214
*/
1315
public class SimpleTextViewHolder extends RecyclerView.ViewHolder {
1416
private TextView textView;
17+
private View spacing;
18+
19+
public static SimpleTextViewHolder newInstance(LayoutInflater inflater, ViewGroup parent) {
20+
View view = inflater.inflate(R.layout.list_item_simple_text, parent, false);
21+
return new SimpleTextViewHolder(view);
22+
}
1523

1624
public SimpleTextViewHolder(View itemView) {
1725
super(itemView);
1826

1927
textView = (TextView)itemView.findViewById(R.id.simple_text_text_view);
28+
spacing = itemView.findViewById(R.id.simple_text_spacing);
2029
}
2130

2231
public void setText(String text) {
@@ -31,6 +40,10 @@ public void setPosition(int position) {
3140
textView.setTag(position);
3241
}
3342

43+
public void setSpacingVisible(boolean visible) {
44+
spacing.setVisibility(visible ? View.VISIBLE : View.GONE);
45+
}
46+
3447
public void setOnClickListener(View.OnClickListener listener) {
3548
textView.setOnClickListener(listener);
3649
}

0 commit comments

Comments
 (0)