Skip to content

Commit 5cac651

Browse files
author
梁任彦
committed
添加HeaderRecyclerView。
1 parent 36cf895 commit 5cac651

File tree

7 files changed

+188
-13
lines changed

7 files changed

+188
-13
lines changed

app/src/main/java/com/donkingliang/headerviewadapterdemo/MainActivity.java

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,33 @@
22

33
import android.support.v7.app.AppCompatActivity;
44
import android.os.Bundle;
5+
import android.support.v7.widget.GridLayoutManager;
56
import android.support.v7.widget.LinearLayoutManager;
67
import android.support.v7.widget.RecyclerView;
78
import android.view.LayoutInflater;
89
import android.view.View;
910

10-
import com.donkingliang.headerviewadapter.HeaderViewAdapter;
11-
import com.donkingliang.headerviewadapter.HeaderViewGridLayoutManager;
11+
import com.donkingliang.headerviewadapter.adapter.HeaderViewAdapter;
12+
import com.donkingliang.headerviewadapter.layoutmanager.HeaderViewGridLayoutManager;
13+
import com.donkingliang.headerviewadapter.view.HeaderRecyclerView;
14+
import com.donkingliang.headerviewadapterdemo.adapter.GridAdapter;
15+
import com.donkingliang.headerviewadapterdemo.adapter.LinearAdapter;
1216

1317
public class MainActivity extends AppCompatActivity {
1418

15-
private RecyclerView rvList;
19+
// private RecyclerView rvList;
20+
private HeaderRecyclerView rvList;
1621

1722
@Override
1823
protected void onCreate(Bundle savedInstanceState) {
1924
super.onCreate(savedInstanceState);
2025
setContentView(R.layout.activity_main);
2126

22-
rvList = (RecyclerView) findViewById(R.id.rv_list);
23-
showLinearList();
27+
// rvList = (RecyclerView) findViewById(R.id.rv_list);
28+
// showLinearList();
2429
// showGridList();
30+
rvList = (HeaderRecyclerView) findViewById(R.id.rv_list);
31+
showHeaderRecyclerView();
2532
}
2633

2734
private void showLinearList() {
@@ -49,4 +56,16 @@ private void showGridList() {
4956
headerViewAdapter.addFooterView(fv);
5057
rvList.setAdapter(headerViewAdapter);
5158
}
59+
60+
private void showHeaderRecyclerView() {
61+
GridAdapter adapter = new GridAdapter(this);
62+
rvList.setLayoutManager(new GridLayoutManager(this, 2));
63+
rvList.setAdapter(adapter);
64+
View hv1 = LayoutInflater.from(this).inflate(R.layout.layout_header, rvList, false);
65+
View hv2 = LayoutInflater.from(this).inflate(R.layout.layout_header_view, rvList, false);
66+
View fv = LayoutInflater.from(this).inflate(R.layout.layout_footer_view, rvList, false);
67+
rvList.addHeaderView(hv1);
68+
rvList.addHeaderView(hv2);
69+
rvList.addFooterView(fv);
70+
}
5271
}

app/src/main/java/com/donkingliang/headerviewadapterdemo/GridAdapter.java renamed to app/src/main/java/com/donkingliang/headerviewadapterdemo/adapter/GridAdapter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.donkingliang.headerviewadapterdemo;
1+
package com.donkingliang.headerviewadapterdemo.adapter;
22

33
import android.content.Context;
44
import android.support.v7.widget.RecyclerView;
@@ -7,6 +7,8 @@
77
import android.view.View;
88
import android.view.ViewGroup;
99

10+
import com.donkingliang.headerviewadapterdemo.R;
11+
1012
/**
1113
* Depiction:
1214
* Author:lry

app/src/main/java/com/donkingliang/headerviewadapterdemo/LinearAdapter.java renamed to app/src/main/java/com/donkingliang/headerviewadapterdemo/adapter/LinearAdapter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.donkingliang.headerviewadapterdemo;
1+
package com.donkingliang.headerviewadapterdemo.adapter;
22

33
import android.content.Context;
44
import android.support.v7.widget.RecyclerView;
@@ -7,6 +7,8 @@
77
import android.view.View;
88
import android.view.ViewGroup;
99

10+
import com.donkingliang.headerviewadapterdemo.R;
11+
1012
/**
1113
* Depiction:
1214
* Author:lry

app/src/main/res/layout/activity_main.xml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,13 @@
55
android:background="#eeeeee"
66
android:orientation="vertical">
77

8-
<android.support.v7.widget.RecyclerView
8+
<!--<android.support.v7.widget.RecyclerView-->
9+
<!--android:id="@+id/rv_list"-->
10+
<!--android:layout_width="match_parent"-->
11+
<!--android:layout_height="match_parent" />-->
12+
13+
<com.donkingliang.headerviewadapter.view.HeaderRecyclerView
914
android:id="@+id/rv_list"
1015
android:layout_width="match_parent"
1116
android:layout_height="match_parent" />
12-
1317
</LinearLayout>

headerviewadapter/src/main/java/com/donkingliang/headerviewadapter/HeaderViewAdapter.java renamed to headerviewadapter/src/main/java/com/donkingliang/headerviewadapter/adapter/HeaderViewAdapter.java

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.donkingliang.headerviewadapter;
1+
package com.donkingliang.headerviewadapter.adapter;
22

33
import android.support.v7.widget.RecyclerView;
44
import android.support.v7.widget.StaggeredGridLayoutManager;
@@ -120,6 +120,29 @@ public int getItemViewType(int position) {
120120
return mAdapter.getItemViewType(adjPosition);
121121
}
122122

123+
/**
124+
* 设置被包装的adapter。
125+
*
126+
* @param adapter
127+
*/
128+
public void setAdapter(RecyclerView.Adapter adapter) {
129+
if (adapter instanceof HeaderViewAdapter) {
130+
//被包装的adapter不能是HeaderViewAdapter。
131+
throw new IllegalArgumentException("Cannot wrap a HeaderViewAdapter");
132+
}
133+
this.mAdapter = adapter;
134+
notifyDataSetChanged();
135+
}
136+
137+
/**
138+
* 获取被包装的adapter
139+
*
140+
* @return
141+
*/
142+
public RecyclerView.Adapter getAdapter() {
143+
return mAdapter;
144+
}
145+
123146
/**
124147
* 判断当前位置是否是头部View。
125148
*
@@ -327,12 +350,16 @@ public boolean onFailedToRecycleView(RecyclerView.ViewHolder holder) {
327350

328351
@Override
329352
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
330-
mAdapter.onAttachedToRecyclerView(recyclerView);
353+
if(mAdapter != null) {
354+
mAdapter.onAttachedToRecyclerView(recyclerView);
355+
}
331356
}
332357

333358
@Override
334359
public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
335-
mAdapter.onDetachedFromRecyclerView(recyclerView);
360+
if(mAdapter != null) {
361+
mAdapter.onDetachedFromRecyclerView(recyclerView);
362+
}
336363
}
337364

338365
@Override

headerviewadapter/src/main/java/com/donkingliang/headerviewadapter/HeaderViewGridLayoutManager.java renamed to headerviewadapter/src/main/java/com/donkingliang/headerviewadapter/layoutmanager/HeaderViewGridLayoutManager.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
package com.donkingliang.headerviewadapter;
1+
package com.donkingliang.headerviewadapter.layoutmanager;
22

33
import android.content.Context;
44
import android.support.v7.widget.GridLayoutManager;
55
import android.util.AttributeSet;
66

7+
import com.donkingliang.headerviewadapter.adapter.HeaderViewAdapter;
8+
79
/**
810
* Depiction: HeaderViewGridLayoutManager是为适配RecyclerView同时使用{@link HeaderViewAdapter}
911
* 和{@link GridLayoutManager}而提供的一个GridLayoutManager子类。它保证了RecyclerView在使用GridLayoutManager
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package com.donkingliang.headerviewadapter.view;
2+
3+
import android.content.Context;
4+
import android.support.annotation.Nullable;
5+
import android.support.v7.widget.GridLayoutManager;
6+
import android.support.v7.widget.RecyclerView;
7+
import android.util.AttributeSet;
8+
import android.view.View;
9+
10+
import com.donkingliang.headerviewadapter.adapter.HeaderViewAdapter;
11+
import com.donkingliang.headerviewadapter.layoutmanager.HeaderViewGridLayoutManager;
12+
13+
/**
14+
* Depiction:
15+
* Author:lry
16+
* Dat:2017/11/13
17+
*/
18+
public class HeaderRecyclerView extends RecyclerView {
19+
20+
//内置的HeaderViewAdapter包装对象。
21+
private HeaderViewAdapter mAdapter;
22+
23+
public HeaderRecyclerView(Context context) {
24+
super(context);
25+
wrapHeaderAdapter();
26+
}
27+
28+
public HeaderRecyclerView(Context context, @Nullable AttributeSet attrs) {
29+
super(context, attrs);
30+
wrapHeaderAdapter();
31+
}
32+
33+
public HeaderRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
34+
super(context, attrs, defStyle);
35+
wrapHeaderAdapter();
36+
}
37+
38+
@Override
39+
public void setLayoutManager(LayoutManager layout) {
40+
//如果要使用GridLayoutManager的话,只能使用HeaderViewGridLayoutManager。
41+
if (layout instanceof GridLayoutManager && !(layout instanceof HeaderViewGridLayoutManager)) {
42+
super.setLayoutManager(new HeaderViewGridLayoutManager(getContext(),
43+
((GridLayoutManager) layout).getSpanCount(), mAdapter));
44+
} else {
45+
super.setLayoutManager(layout);
46+
}
47+
}
48+
49+
private void wrapHeaderAdapter() {
50+
mAdapter = new HeaderViewAdapter(super.getAdapter());
51+
super.setAdapter(mAdapter);
52+
}
53+
54+
@Override
55+
public void setAdapter(Adapter adapter) {
56+
mAdapter.setAdapter(adapter);
57+
}
58+
59+
@Override
60+
public Adapter getAdapter() {
61+
return mAdapter.getAdapter();
62+
}
63+
64+
/**
65+
* 获取HeaderView的个数
66+
*
67+
* @return
68+
*/
69+
public int getHeadersCount() {
70+
return mAdapter.getHeadersCount();
71+
}
72+
73+
/**
74+
* 获取FooterView的个数
75+
*
76+
* @return
77+
*/
78+
public int getFootersCount() {
79+
return mAdapter.getFootersCount();
80+
}
81+
82+
/**
83+
* 添加HeaderView
84+
*
85+
* @param view
86+
*/
87+
public void addHeaderView(View view) {
88+
mAdapter.addHeaderView(view);
89+
}
90+
91+
/**
92+
* 删除HeaderView
93+
*
94+
* @param view
95+
* @return 是否删除成功
96+
*/
97+
public boolean removeHeaderView(View view) {
98+
return mAdapter.removeHeaderView(view);
99+
}
100+
101+
/**
102+
* 添加FooterView
103+
*
104+
* @param view
105+
*/
106+
public void addFooterView(View view) {
107+
mAdapter.addFooterView(view);
108+
}
109+
110+
/**
111+
* 删除FooterView
112+
*
113+
* @param view
114+
* @return 是否删除成功
115+
*/
116+
public boolean removeFooterView(View view) {
117+
return mAdapter.removeFooterView(view);
118+
}
119+
}

0 commit comments

Comments
 (0)