在使用listview加载大量数据时,如果一次性加载过多数据并显示,会出现卡顿,程序出现好几秒的空白状态。这时候就需要上拉加载更多的功能。在这我使用PullToRefresh的类库来超简单的实现关于listview的进阶功能。
下载PullToRefresh文件,地址:https://github.com/chrisbanes/Android-PullToRefresh。这里面,我们只要其中的Library工程。将它引入我们的工程.
再完成剩下的两步就能实现需要的功能了:
首先:在布局代码中添加自定义的listview。
<com.handmark.pulltorefresh.library.PullToRefreshListView
xmlns:ptr="http://schemas.android.com/apk/res-auto"
android:id="@+id/pull_refresh_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:cacheColorHint="#00000000"
android:divider="#19000000"
android:dividerHeight="4dp"
android:fadingEdge="none"
android:fastScrollEnabled="false"
android:footerDividersEnabled="false"
android:headerDividersEnabled="false"
android:smoothScrollbar="true"
ptr:ptrListViewExtrasEnabled="false"
ptr:ptrAnimationStyle="flip"
ptr:ptrMode="both" <!-- 刷新和加载都用 -->
ptr:ptrScrollingWhileRefreshingEnabled="true" >
</com.handmark.pulltorefresh.library.PullToRefreshListView>
接下来activity文件中实现:
import java.util.LinkedList;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener2;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends Activity {
private LinkedList<String> mListItems;
/**
* 上拉刷新的控件
*/
private PullToRefreshListView mPullRefreshListView;
private ArrayAdapter<String> mAdapter;
private int mItemCount = 15;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 得到控件
mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list);
mPullRefreshListView.setMode(Mode.BOTH);
// 初始化数据
initDatas();
// 设置适配器
mAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, mListItems);
mPullRefreshListView.setAdapter(mAdapter);
mPullRefreshListView
.setOnRefreshListener(new OnRefreshListener2<ListView>()
{
@Override
public void onPullDownToRefresh(
PullToRefreshBase<ListView> refreshView)
{
Log.e("TAG", "onPullDownToRefresh");
//这里写下拉刷新的任务
new GetDataTask().execute();
}
@Override
public void onPullUpToRefresh(
PullToRefreshBase<ListView> refreshView)
{
Log.e("TAG", "onPullUpToRefresh");
//这里写上拉加载更多的任务
new GetDataTask().execute();
}
});
}
private void initDatas()
{
// 初始化数据和数据源
mListItems = new LinkedList<String>();
for (int i = 0; i < mItemCount; i++)
{
mListItems.add("" + i);
}
}
private class GetDataTask extends AsyncTask<Void, Void, String>
{
@Override
protected String doInBackground(Void... params)
{
try
{
Thread.sleep(2000);
} catch (InterruptedException e)
{
}
return "" + (mItemCount++);
}
@Override
protected void onPostExecute(String result)
{
mListItems.add(result);
mAdapter.notifyDataSetChanged();
// Call onRefreshComplete when the list has been refreshed.
mPullRefreshListView.onRefreshComplete();
}
}
}
原理就是:ListView+OnScrollListener+接口回调