SwipeToLoadLayout实现Android下拉刷新及上拉加载

最近一段时间需要对手上的项目进行重构,一方面等甲方对业务流程的需求,另一方面由于新配了电脑可以流畅的运行Android Studio了正好也闲着没事就打算把UI重新搞一搞顺便降低各个模块的耦合度,在实现列表的地方恶心到我了。

因为之前一直用的的PullToRefresh在列表中直接实现下拉刷新和上拉加载,但是在实际业务由于该列表采用文字提醒而不同的模块提示内容其实应该是不同的所以有时就会相当恼火,另外UI重构之后全部采用Material Design风格的控件再用这个列表就显得有些不伦不类,之前看到有文章讲V4包里面有个SwipeRefreshLayout但是不知道为什么没有提供上拉加载的功能,看到网上不少教程说可以继承它自己实现但是毕竟我不怎么懂UI做出来的东西在交互性上有点奇怪,主要体现在在尺寸和速度上把握不好,实现出来的效果很生硬,于是只好上github上面找找有木有什么现成的可以用,于是发现了一个很不错的项目叫做SwipeToLoadLayout,项目地址:https://github.com/Aspsine/SwipeToLoadLayout

该项目不但实现了下拉刷新和上拉加载同时可以允许开发者自定义下拉刷新和上拉加载的动画,比PullToRefresh进步了不少,其官方提供了一个demo来展示该插件能够实现的效果,大家可以自己去github上面下载。但是遗憾的是由于该项目提供的示例代码是集成在一起的,可能对于一部分初学者比如赶项目参加比赛的学生或者是一些初级码农来说会有一定的困难我今天早上花了一个多小时抽取出一个比较简洁的示例来供使用。

首先是要使用android studio导入项目,我在最终完成后的项目结构如下:

SwipeToLoadLayout实现Android下拉刷新及上拉加载_第1张图片

我这里把各个文件的代码放上来,首先是MainActivity:

package com.panda.dlmu.myapplication;

import android.support.v4.view.AsyncLayoutInflater;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.aspsine.swipetoloadlayout.OnLoadMoreListener;
import com.aspsine.swipetoloadlayout.OnRefreshListener;
import com.aspsine.swipetoloadlayout.SwipeToLoadLayout;

public class MainActivity extends AppCompatActivity implements OnRefreshListener, OnLoadMoreListener {

    private SwipeToLoadLayout swipeToLoadLayout;
    private View header;
    private View footer;
    private int mRefreshNum;
    private int mLoadMoreNum;
    private ArrayAdapter mAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 布局文件,直接从github考过来的
        setContentView(R.layout.fragment_nav_java_code);
        mAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1);
        swipeToLoadLayout = (SwipeToLoadLayout) findViewById(R.id.swipeToLoadLayout);
        // 列表
        ListView listView = (ListView) findViewById(R.id.swipe_target);
        listView.setAdapter(mAdapter);
        // 初始化往列表里面填一点东西
        for(int i=0;i<12;i++){
            mAdapter.add("Load More" + mLoadMoreNum);
        }
        // 上拉和下拉加载时的动画效果,可以自己继承实现其他效果或者把网上现成的直接扒过来用
        footer = getLayoutInflater().inflate(R.layout.layout_google_footer, swipeToLoadLayout, false);
        swipeToLoadLayout.setLoadMoreFooterView(footer);
        header = getLayoutInflater().inflate(R.layout.layout_google_header, swipeToLoadLayout, false);
        swipeToLoadLayout.setRefreshHeaderView(header);
        // 设置监听器
        swipeToLoadLayout.setOnRefreshListener(this);
        swipeToLoadLayout.setOnLoadMoreListener(this);

    }
    // 上拉时的相应
    @Override
    public void onLoadMore() {
        swipeToLoadLayout.postDelayed(new Runnable() {
            @Override
            public void run() {
                swipeToLoadLayout.setLoadingMore(false);
                mAdapter.add("Load More" + mLoadMoreNum);
                mLoadMoreNum++;
            }
        }, 1000);
    }

    // 下拉
    @Override
    public void onRefresh() {
        swipeToLoadLayout.postDelayed(new Runnable() {
            @Override
            public void run() {
                swipeToLoadLayout.setRefreshing(false);
                mAdapter.insert("Refresh" + mRefreshNum, 0);
                mRefreshNum++;
            }
        }, 4000);
    }
}

布局文件如下:



    

        

    

剩下的在layout_google_footer和layout_google_header是需要把引用的类改成自己包里的内容的,比如:




    

然后执行就能够自带下拉刷新和上拉加载的效果了,当然只复制这些代码的话还是会报错因为缺少一些引用,我给出的方案就是需要哪个文件就直接从项目里面复制过去。最后效果如下:

SwipeToLoadLayout实现Android下拉刷新及上拉加载_第2张图片

你可能感兴趣的:(安卓入门基础)