实现官方下拉刷新,增加自动加载更多

官方的下拉刷新出来也挺久了,效果也是比较炫酷,有比较多的应用都已经能看到它的身影了,关于SwipeRefreshLayout大家可以自己去官方查看 https://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html 我们下面来讲一下它的使用 因为它是依赖包中的,所以首先,我们需要把它引入到我们的工程中

dependencies {compile fileTree(dir: ‘libs’, include: [‘*.jar’])compile ‘com.android.support:appcompat-v7:22.2.0’}

然后我们在布局里面使用它,让它里面包裹一个listview

===”match_parent”><ListView=”match_parent” /></android.support.v4.widget.SwipeRefreshLayout>

SwipeRefreshLayout 主要有三个比较常用的方法,分别是 setColorSchemeResources(int… colorResIds) Set the color resources used in the progress animation from color resources.就是设置那个刷新的圈圈里面那个线的颜色.可以看到它接受的是一个可变参数,最多能设置4个颜色.

setOnRefreshListener(SwipeRefreshLayout.OnRefreshListener listener) Set the listener to be notified when a refresh is triggered via the swipe gesture.设置监听,用于监听刷新时间的触发

setRefreshing(boolean refreshing) Notify the widget that refresh state has changed.通知刷新状态的改变,我们可以通过这个方法来设置圈圈的显示和消失

常用的三个方法介绍完了,我们来使用一下

.OnRefreshListener {private SwipeRefreshLayout mSwipeRefreshLayout;private ListView mListView;private List<String> mDatas = new ArrayList<>();private ContentAdapter mAdapter;private int mIndex;(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_swipe_refresh);initUI();initData();addEvent();}() {//添加刷新监听mSwipeRefreshLayout.setOnRefreshListener(this);}() {mListView = (ListView) findViewById(R.id.lv_refresh);mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swp);//设置圈圈颜色mSwipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_light,android.R.color.holo_red_light, android.R.color.holo_orange_light,android.R.color.holo_green_light);}() {generateData();mAdapter = new ContentAdapter(mDatas, this);mListView.setAdapter(mAdapter);}/*** 生成listview的数据*/() {for (int i = 0; i < 20; i++) {mDatas.add(“数据” + mIndex++);}}/*** 刷新的监听,这里模拟一个耗时的操作*/() {new Handler().postDelayed(new Runnable() {() {mDatas.clear();generateData();mAdapter.notifyDataSetChanged();//完成刷新操作,隐藏圈圈mSwipeRefreshLayout.setRefreshing(false);}}, 1500);}}

再贴上adapter的代码

{private List<String> mDatas;private Context mContext;public ContentAdapter(List<String> mDatas, Context mContext) {this.mDatas = mDatas;this.mContext = mContext;}() {return mDatas == null ? 0 : mDatas.size();}@Overridepublic Object getItem(int i) {return null;}(int i) {return 0;}@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {ViewHolder viewHolder;if (view == null) {view = LayoutInflater.from(mContext).inflate(R.layout.item_test, viewGroup, false);viewHolder = new ViewHolder(view);view.setTag(viewHolder);} else {viewHolder = (ViewHolder) view.getTag();}viewHolder.mTv.setText(mDatas.get(i));return view;}{TextView mTv;public ViewHolder(View view) {mTv = (TextView) view.findViewById(R.id.tv);}}}

我们来运行一下看看

嗯,效果还是不错的,但是在我们往下拉的时候,我们的那个listview在下拉的时候是没有反应的,那么问题来了,我们需要怎么样去实现下拉自动加载更多了,网上也有比较多教程,有种方式是重写SwipeRefreshLayout来实现的,不过这里我们不用那种方式,我们通过重写Listview ,在listview滑动到底部去监听不也可以实现吗. 原理很简单,就是给他添加footerview,在滑动到底部的时候回调一个方法,让我们来做加载更多的逻辑,然后在加载完去notify一下,在没有数据的时候把footerview remove掉

/** * Class description goes here. * * @author 帅哥海 */{private boolean isLoading;private LoadingView loadingView;public boolean hasMoreItems;private Pagingable pagingableListener;public AutoLoadListView(Context context) {this(context, null);}public AutoLoadListView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public AutoLoadListView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}() {return this.isLoading;}(boolean isLoading) {this.isLoading = isLoading;}(Pagingable pagingableListener) {this.pagingableListener = pagingableListener;}(boolean hasMoreItems) {this.hasMoreItems = hasMoreItems;if (!this.hasMoreItems) {removeFooterView(loadingView);} else if (findViewById(R.id.loading_view) == null) {addFooterView(loadingView);ListAdapter adapter = ((HeaderViewListAdapter) getAdapter()).getWrappedAdapter();setAdapter(adapter);}}() {return this.hasMoreItems;}() {isLoading = false;loadingView = new LoadingView(getContext());//设置footerviewaddFooterView(loadingView);//添加滑动监听super.setOnScrollListener(new OnScrollListener() {(AbsListView absListView, int i) {}(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {//获取当前底下的条目位置,其值为第一个可见的条目加上所有可见的条目,int lastVisibleItem = firstVisibleItem + visibleItemCount;(!isLoading && hasMoreItems && (lastVisibleItem == totalItemCount)) {//判断加载回调更多是否不为null,if (pagingableListener != null) {isLoading = true;pagingableListener.onLoadMoreItems();}}}});}{void onLoadMoreItems();}}人,总是很难改正自己的缺点,

实现官方下拉刷新,增加自动加载更多

相关文章:

你感兴趣的文章:

标签云: