前言
app中最常见的场景莫过于下拉刷新和自动加载的功能了,最经典的开源组件就是
本次demo的编辑环境为android studio,java1.8
截图
使用
1.本示例依赖jar如下:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'de.greenrobot:eventbus:2.4.0'
compile('in.srain.cube:ultra-ptr:1.0.9.1-SNAPSHOT@aar') {
exclude group: 'in.srain.cube', module: 'clog'
}
compile('in.srain.cube:cube-sdk:1.0.44.33-SNAPSHOT@aar') {
exclude group: 'in.srain.cube', module: 'clog'
}
}
2.xml中的内容:
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="loadmore.example.jan.org.loadmoredemo.MainActivity">
android:id="@+id/load_more_list_view_ptr_frame"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:id="@+id/load_more_list_view_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cube_mints_white">
android:id="@+id/load_more_listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@null"
android:fadingEdge="none"
android:listSelector="@android:color/transparent"
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:scrollbarStyle="outsideOverlay" />
PtrClassicFrameLayout 是一个可以起到下拉刷新的实现的父类布局,而LoadMoreListViewContainer则是加载更多的布局控件。
3.MainActivity.java demo主要的代码实现,步骤和说明已注释
/**
* 利用android-Ultra-Pull-To-Refresh,上拉刷新和上拉加载的简单的dome
*/
public class MainActivity extends AppCompatActivity {
private PtrFrameLayout mPtrFrameLayout;
private LoadMoreListViewContainer mLoadMoreListViewContainer;
private ListView mListView;
private List mockStrList = new ArrayList<>();
private int start = 0;
private int count = 15;
private PagedListViewDataAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.find the listview
mListView = (ListView) findViewById(R.id.load_more_listview);
// 为listview的创建一个headerview,注意,如果不加会影响到加载的footview的显示!
View headerMarginView = new View(this);
headerMarginView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, LocalDisplay.dp2px(20)));
mListView.addHeaderView(headerMarginView);
//2.绑定模拟的数据
final ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, mockStrList);
mListView.setAdapter(adapter);
//3.设置下拉刷新组件和事件监听
mPtrFrameLayout = (PtrFrameLayout) findViewById(R.id.load_more_list_view_ptr_frame);
mPtrFrameLayout.setLoadingMinTime(1000);
mPtrFrameLayout.setPtrHandler(new PtrHandler() {
@Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
// here check list view, not content.
return PtrDefaultHandler.checkContentCanBePulledDown(frame, mListView, header);
}
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
//实现下拉刷新的功能
Log.i("test", "-----onRefreshBegin-----");
mPtrFrameLayout.postDelayed(new Runnable() {
@Override
public void run() {
mockStrList.clear();
start = 0;
mockStrList.addAll(getMockData(start, count));
mPtrFrameLayout.refreshComplete();
//第一个参数是:数据是否为空;第二个参数是:是否还有更多数据
mLoadMoreListViewContainer.loadMoreFinish(false, true);
adapter.notifyDataSetChanged();
}
}, 500);
}
});
//设置延时自动刷新数据
mPtrFrameLayout.postDelayed(new Runnable() {
@Override
public void run() {
mPtrFrameLayout.autoRefresh(false);
}
}, 200);
//4.加载更多的组件
mLoadMoreListViewContainer = (LoadMoreListViewContainer) findViewById(R.id.load_more_list_view_container);
mLoadMoreListViewContainer.setAutoLoadMore(true);//设置是否自动加载更多
mLoadMoreListViewContainer.useDefaultHeader();
//5.添加加载更多的事件监听
mLoadMoreListViewContainer.setLoadMoreHandler(new LoadMoreHandler() {
@Override
public void onLoadMore(LoadMoreContainer loadMoreContainer) {
//模拟加载更多的业务处理
mLoadMoreListViewContainer.postDelayed(new Runnable() {
@Override
public void run() {
start++;
mockStrList.addAll(getMockData(start * 10, count));
if (start * 10 > 30) {
// mLoadMoreListViewContainer.loadMoreFinish(true, false);
//以下是加载失败的情节
int errorCode = 0;
String errorMessage = "加载失败,点击加载更多";
mLoadMoreListViewContainer.loadMoreError(errorCode, errorMessage);
} else {
mLoadMoreListViewContainer.loadMoreFinish(false, true);
}
adapter.notifyDataSetChanged();
}
}, 1000);
}
});
}
/**
* 做一个简单的内容数据
* @param start 开始位置
* @param count 每次拉取的数量
* @return
*/
private List getMockData(int start, int count) {
List slist = new ArrayList();
for (int i = start; i < start + count; i++) {
slist.add("内容编号:" + i);
}
return slist;
}
} 基本就这样,还可以自己定义加载的ui.下次再写个demo试试吧。