介绍:
一个实现了下拉刷新,滚动到底部加载更多以及添加header功能的的RecyclerView。使用方式和RecyclerView完全一致,不需要额外的layout,不需要写特殊的adater。 加载效果内置了AVLoadingIndicatorView上的所有效果,可以根据需要指定。
项目地址:https://github.com/jianghejie/XRecyclerView
效果:
使用:
xml
01.
<RelativeLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
02.
xmlns:tools=
"http://schemas.android.com/tools"
03.
android:layout_width=
"match_parent"
04.
android:layout_height=
"match_parent"
05.
tools:context=
".MainActivity"
>
06.
07.
<com.jcodecraeer.xrecyclerview.XRecyclerView
08.
android:id=
"@+id/recyclerview"
09.
android:layout_width=
"fill_parent"
10.
android:layout_height=
"fill_parent"
/>
11.
12.
</RelativeLayout>
2.MainActivity
001.
package
com.example.xrecyclerview;
002.
003.
import
android.os.Bundle;
004.
import
android.os.Handler;
005.
import
android.support.v7.app.AppCompatActivity;
006.
import
android.support.v7.widget.LinearLayoutManager;
007.
import
android.view.LayoutInflater;
008.
import
android.view.Menu;
009.
import
android.view.MenuItem;
010.
import
android.view.View;
011.
import
android.view.ViewGroup;
012.
013.
import
com.jcodecraeer.xrecyclerview.ProgressStyle;
014.
import
com.jcodecraeer.xrecyclerview.XRecyclerView;
015.
016.
import
java.util.ArrayList;
017.
018.
public
class
MainActivity
extends
AppCompatActivity {
019.
private
XRecyclerView mRecyclerView;
020.
private
MyAdapter mAdapter;
021.
private
ArrayList<String> listData;
022.
private
int
refreshTime =
0
;
023.
@Override
024.
protected
void
onCreate(Bundle savedInstanceState) {
025.
super
.onCreate(savedInstanceState);
026.
setContentView(R.layout.activity_main);
027.
mRecyclerView = (XRecyclerView)
this
.findViewById(R.id.recyclerview);
028.
LinearLayoutManager layoutManager =
new
LinearLayoutManager(
this
);
029.
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
030.
mRecyclerView.setLayoutManager(layoutManager);
031.
032.
mRecyclerView.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);
033.
mRecyclerView.setLaodingMoreProgressStyle(ProgressStyle.Pacman);
034.
mRecyclerView.setArrowImageView(R.drawable.iconfont_downgrey);
035.
036.
View header = LayoutInflater.from(
this
).inflate(R.layout.recyclerview_header, (ViewGroup)findViewById(android.R.id.content),
false
);
037.
mRecyclerView.addHeaderView(header);
038.
039.
040.
mRecyclerView.setLoadingListener(
new
XRecyclerView.LoadingListener() {
041.
@Override
042.
public
void
onRefresh() {
043.
refreshTime ++;
044.
new
Handler().postDelayed(
new
Runnable(){
045.
public
void
run() {
046.
listData.clear();
047.
for
(
int
i =
0
; i <
15
;i++){
048.
listData.add(
"item"
+ i +
"after "
+ refreshTime +
" times of refresh"
);
049.
}
050.
mAdapter.notifyDataSetChanged();
051.
mRecyclerView.refreshComplete();
052.
}
053.
054.
},
3000
);
//refresh data here
055.
}
056.
057.
@Override
058.
public
void
onLoadMore() {
059.
new
Handler().postDelayed(
new
Runnable(){
060.
public
void
run() {
061.
for
(
int
i =
0
; i <
15
;i++){
062.
listData.add(
"item"
+ (i + listData.size()) );
063.
}
064.
mAdapter.notifyDataSetChanged();
065.
mRecyclerView.loadMoreComplete();
066.
}
067.
},
3000
);
068.
069.
}
070.
});
071.
072.
listData =
new
ArrayList<String>();
073.
mAdapter =
new
MyAdapter(listData);
074.
for
(
int
i =
0
; i <
15
;i++){
075.
listData.add(
"item"
+ i);
076.
}
077.
mRecyclerView.setAdapter(mAdapter);
078.
}
079.
080.
@Override
081.
public
boolean
onCreateOptionsMenu(Menu menu) {
082.
// Inflate the menu; this adds items to the action bar if it is present.
083.
getMenuInflater().inflate(R.menu.menu_main, menu);
084.
return
true
;
085.
}
086.
087.
@Override
088.
public
boolean
onOptionsItemSelected(MenuItem item) {
089.
// Handle action bar item clicks here. The action bar will
090.
// automatically handle clicks on the Home/Up button, so long
091.
// as you specify a parent activity in AndroidManifest.xml.
092.
int
id = item.getItemId();
093.
094.
//noinspection SimplifiableIfStatement
095.
if
(id == R.id.action_settings) {
096.
return
true
;
097.
}
098.
099.
return
super
.onOptionsItemSelected(item);
100.
}
101.
102.
103.
}
3. adapter
01.
package
com.example.xrecyclerview;
02.
03.
import
android.support.v7.widget.RecyclerView;
04.
import
android.view.LayoutInflater;
05.
import
android.view.View;
06.
import
android.view.ViewGroup;
07.
import
android.widget.TextView;
08.
09.
import
java.util.ArrayList;
10.
11.
/**
12.
* Created by jianghejie on 15/11/26.
13.
*/
14.
public
class
MyAdapter
extends
RecyclerView.Adapter<MyAdapter.ViewHolder> {
15.
public
ArrayList<String> datas =
null
;
16.
public
MyAdapter(ArrayList<String> datas) {
17.
this
.datas = datas;
18.
}
19.
//创建新View,被LayoutManager所调用
20.
@Override
21.
public
ViewHolder onCreateViewHolder(ViewGroup viewGroup,
int
viewType) {
22.
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item,viewGroup,
false
);
23.
ViewHolder vh =
new
ViewHolder(view);
24.
return
vh;
25.
}
26.
//将数据与界面进行绑定的操作
27.
@Override
28.
public
void
onBindViewHolder(ViewHolder viewHolder,
int
position) {
29.
viewHolder.mTextView.setText(datas.get(position));
30.
}
31.
//获取数据的数量
32.
@Override
33.
public
int
getItemCount() {
34.
return
datas.size();
35.
}
36.
//自定义的ViewHolder,持有每个Item的的所有界面元素
37.
public
static
class
ViewHolder
extends
RecyclerView.ViewHolder {
38.
public
TextView mTextView;
39.
public
ViewHolder(View view){
40.
super
(view);
41.
mTextView = (TextView) view.findViewById(R.id.text);
42.
}
43.
}
44.
}