【一个强大的拉动刷新开源项目,支持各种控件下拉刷新 ListView、ViewPager、WevView、ExpandableListView、GridView、(Horizontal )ScrollView、Fragment上下左右拉动刷新,比下面johannilsson那个只支持ListView的强大的多。并且他实现的下拉刷新ListView在item不足一屏情况下也不会显示刷新提示,体验更好。】
第一步:新建Android工程SampleDemo
第二步:在res/values下新建attrs.xml
第三步:将所需要的图片文件放入相应的文件夹下面,所用的图片文件有:
第四步:
1、导入或将开源项目android-pulltorefresh中需要的类文件(.java),加入到自己的项目中的指定包内。
该演示用例涉及的类文件为:
【librarysrccomhandmarkpulltorefreshlibrary】
PullToRefreshAdapterViewBase.java
PullToRefreshBase.java
PullToRefreshListView.java
【librarysrccomhandmarkpulltorefreshlibraryinternal】
EmptyViewMethodAccessor.java
LoadingLayout.java
2、构建自己所需要的类文件(.java)。
【PullTask.java】
【PullAdapter.java】
第四步:为PullAdapter.java 设计布局文件layout_main_listitem.xml
滑动时出现提醒布局文件pull_to_refresh_header.xml
MainActivity.java 主布局文件activity_main.xml
第五步:编写MainActivity.java
第一步:新建Android工程SampleDemo
第二步:在res/values下新建attrs.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<!--?xml version=
1.0
encoding=utf-
8
?-->
<resources>
<declare-styleable name=
"PullToRefresh"
>
<flag name=
"pullDownFromTop"
value=
"0x1"
>
<flag name=
"pullUpFromBottom"
value=
"0x2"
>
<flag name=
"both"
value=
"0x3"
>
</flag></flag></flag></attr>
</declare-styleable>
</resources>
srings.xml
<!--?xml version=
1.0
encoding=utf-
8
?-->
<resources>
<string name=
"app_name"
>SampleDemo</string>
<string name=
"action_settings"
>Settings</string>
<string name=
"pull_to_refresh_pull_down_label"
>滑动刷新</string>
<string name=
"pull_to_refresh_release_label"
>释放刷新</string>
<string name=
"pull_to_refresh_refreshing_label"
>加载中</string>
<string name=
"pull_to_refresh_tap_label"
>点击刷新</string>
</resources>
|

第四步:
1、导入或将开源项目android-pulltorefresh中需要的类文件(.java),加入到自己的项目中的指定包内。
该演示用例涉及的类文件为:
【librarysrccomhandmarkpulltorefreshlibrary】
PullToRefreshAdapterViewBase.java
PullToRefreshBase.java
PullToRefreshListView.java
【librarysrccomhandmarkpulltorefreshlibraryinternal】
EmptyViewMethodAccessor.java
LoadingLayout.java
2、构建自己所需要的类文件(.java)。
【PullTask.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
|
import
java.util.LinkedList;
import
com.example.sampledemo.view.PullToRefreshListView;
import
android.os.AsyncTask;
import
android.widget.BaseAdapter;
public
class
PullTask
extends
AsyncTask<
void
, string=
""
>{
private
PullToRefreshListView pullToRefreshListView;
//实现下拉刷新与上拉加载的ListView
private
int
pullState;
//记录判断,上拉与下拉动作
private
BaseAdapter baseAdapter;
//ListView适配器,用于提醒ListView数据已经更新
private
LinkedList<string> linkedList;
public
PullTask(PullToRefreshListView pullToRefreshListView,
int
pullState,
BaseAdapter baseAdapter, LinkedList<string> linkedList) {
this
.pullToRefreshListView = pullToRefreshListView;
this
.pullState = pullState;
this
.baseAdapter = baseAdapter;
this
.linkedList = linkedList;
}
@Override
protected
String doInBackground(Void... params) {
try
{
Thread.sleep(
1000
);
}
catch
(InterruptedException e) {
}
return
StringTest;
}
@Override
protected
void
onPostExecute(String result) {
if
(pullState ==
1
) {
//name=pullDownFromTop value=0x1 下拉
linkedList.addFirst(顶部数据);
}
if
(pullState ==
2
) {
//name=pullUpFromBottom value=0x2 上拉
linkedList.addLast(底部数据);
}
baseAdapter.notifyDataSetChanged();
pullToRefreshListView.onRefreshComplete();
super
.onPostExecute(result);
}
}</string></string></
void
,>
|
【PullAdapter.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
|
import
java.util.LinkedList;
import
com.example.sampledemo.R;
import
android.content.Context;
import
android.view.LayoutInflater;
import
android.view.View;
import
android.view.ViewGroup;
import
android.widget.BaseAdapter;
import
android.widget.TextView;
public
class
PullAdapter
extends
BaseAdapter {
private
LinkedList<string> linkedList;
private
LayoutInflater mInflater;
public
PullAdapter(LinkedList<string> linkedList, Context context) {
mInflater = LayoutInflater.from(context);
this
.linkedList = linkedList;
}
@Override
public
int
getCount() {
return
linkedList.size();
}
@Override
public
Object getItem(
int
position) {
return
linkedList.get(position);
}
@Override
public
long
getItemId(
int
position) {
return
position;
}
@Override
public
View getView(
int
position, View convertView, ViewGroup parent) {
ViewHolder holder=
null
;
if
(convertView ==
null
) {
holder =
new
ViewHolder();
convertView = mInflater.inflate(R.layout.layout_main_listitem,
null
);
holder.textView = (TextView) convertView.findViewById(R.id.textView);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
if
(linkedList.size()>
0
){
final
String dataStr = linkedList.get(position);
holder.textView.setText(dataStr);
}
return
convertView;
}
private
static
class
ViewHolder {
TextView textView;
//数据显示区域
}
}</string></string>
|
第四步:为PullAdapter.java 设计布局文件layout_main_listitem.xml
1
2
3
4
|
<!--?xml version=
1.0
encoding=utf-
8
?-->
<linearlayout android:background=
"#FFFFFF"
android:layout_height=
"match_parent"
android:layout_width=
"match_parent"
android:orientation=
"vertical"
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<textview android:gravity=
"left"
android:id=
"@+id/textView"
android:layout_height=
"wrap_content"
android:layout_margintop=
"4dp"
android:layout_width=
"match_parent"
android:textcolor=
"#99CC66"
android:textsize=
"18dp"
>
</textview></linearlayout>
|
滑动时出现提醒布局文件pull_to_refresh_header.xml
1
2
3
4
5
6
|
<!--?xml version=
1.0
encoding=utf-
8
?-->
<relativelayout android:layout_height=
"fill_parent"
android:layout_width=
"fill_parent"
android:paddingbottom=
"10dip"
android:paddingtop=
"10dp"
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<textview android:id=
"@+id/pull_to_refresh_text"
android:layout_centerinparent=
"true"
android:layout_height=
"wrap_content"
android:layout_width=
"wrap_content"
android:text=
"@string/pull_to_refresh_pull_down_label"
android:textappearance=
"?android:attr/textAppearanceMedium"
android:textstyle=
"bold"
>
<progressbar android:id=
"@+id/pull_to_refresh_progress"
android:indeterminate=
"true"
android:layout_centervertical=
"true"
android:layout_height=
"wrap_content"
android:layout_marginleft=
"30dip"
android:layout_marginright=
"20dip"
android:layout_width=
"wrap_content"
android:visibility=
"gone"
style=
"?android:attr/progressBarStyleSmall"
>
<imageview android:id=
"@+id/pull_to_refresh_image"
android:layout_centervertical=
"true"
android:layout_height=
"wrap_content"
android:layout_marginleft=
"30dip"
android:layout_marginright=
"20dip"
android:layout_width=
"wrap_content"
>
</imageview></progressbar></textview></relativelayout>
|
MainActivity.java 主布局文件activity_main.xml
1
2
3
4
|
<relativelayout android:background=
"#FFFFFF"
android:layout_height=
"match_parent"
android:layout_width=
"match_parent"
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:cp=
"http://schemas.android.com/apk/res/com.example.sampledemo"
xmlns:tools=
"http://schemas.android.com/tools"
>
<com.example.sampledemo.view.pulltorefreshlistview android:background=
"#FFFFFF"
android:cachecolorhint=
"#00000000"
android:divider=
"@android:color/black"
android:dividerheight=
"0.1dip"
android:id=
"@+id/pullrefresh"
android:layout_height=
"fill_parent"
android:layout_width=
"fill_parent"
cp:mode=
"both"
>
</com.example.sampledemo.view.pulltorefreshlistview>
</relativelayout>
|
第五步:编写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
|
import
java.util.Arrays;
import
java.util.LinkedList;
import
com.example.sampledemo.view.PullToRefreshBase.OnRefreshListener;
import
com.example.sampledemo.view.PullToRefreshListView;
import
com.example.sampledemo.view.adapter.PullAdapter;
import
com.example.sampledemo.view.task.PullTask;
import
android.os.Bundle;
import
android.widget.ArrayAdapter;
import
android.widget.ListView;
import
android.app.Activity;
/**
* @ClassName MainActivity.java
* @Author MaHaochen
* @Date 2014-4-30 15:56:47
*/
public
class
MainActivity
extends
Activity {
private
LinkedList<string> mListItems;
private
PullToRefreshListView mPullRefreshListView;
private
ArrayAdapter<string> mAdapter;
private
ListView mListView;
private
PullAdapter pullAdapter;
private
String[] mStrings = { 初始数据
01
,初始数据
02
,初始数据
03
,初始数据
04
,初始数据
05
};
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
}
private
void
initViews() {
mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pullrefresh);
mPullRefreshListView.setOnRefreshListener(mOnrefreshListener);
mListView = mPullRefreshListView.getRefreshableView();
mListItems =
new
LinkedList<string>();
mListItems.addAll(Arrays.asList(mStrings));
pullAdapter =
new
PullAdapter(mListItems, MainActivity.
this
);
mListView.setAdapter(pullAdapter);
}
OnRefreshListener mOnrefreshListener =
new
OnRefreshListener() {
public
void
onRefresh() {
PullTask pullTask =
new
PullTask(mPullRefreshListView,
mPullRefreshListView.getRefreshType(), pullAdapter, mListItems);
pullTask.execute();
}
};
}</string></string></string>
|