资讯专栏INFORMATION COLUMN

【安卓开发笔记】展示列表的加载与刷新实例

edagarli / 2540人阅读

摘要:安卓展示列表的加载与刷新刚开始学习安卓开发,对于信息型应用数据的加载刷新是必不可少的。使用可以容易的实现数据的加载与刷新,我通过学习参考网上实例实现了这两个功能。

安卓展示列表的加载与刷新

刚开始学习安卓开发,对于信息型应用数据的加载刷新是必不可少的。使用RecyclerView可以容易的实现数据的加载与刷新,我通过学习RecyclerView参考网上实例实现了这两个功能。
运行效果:

向上加载时添加自定义的加载提示

关于下拉刷新的实现

使用SwipeRefreshLayout控件,实现自己的SwipeRefreshLayout.OnRefreshListener()接口
google提供加载的方式有两种,可以自由选择

顶部水平进度条

下拉圆形刷新按钮

这部分代码比较简单

public class MainActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener,NewsAdapter.onItemClickListener ,BaseRecyclerView.onLoadMoreListener{
    private SwipeRefreshLayout swipeRefreshLayout;
    private BaseRecyclerView recyclerView;
    private TextView textView;
    private BaseRecyclerViewAdapter baseRecyclerViewAdapter;
    private NewsAdapter newsAdapter;
    private ArrayList lists;//例子中不涉及后台数据,随意编造的数据列表
    private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 0://刷新数据
                    for(int i=0;i<10;i++){
                        Data data=new Data();
                        data.setText("我是刷新的数据"+i);
                        lists.add(i,data);
                    }
                    baseRecyclerViewAdapter.notifyDataSetChanged();
                    swipeRefreshLayout.setRefreshing(false);
                    break;
                case 1://加载数据
                    for(int i=0;i<10;i++){
                        Data data=new Data();
                        data.setText("我是加载的数据"+i);
                        lists.add(data);
                    }
                    baseRecyclerViewAdapter.notifyDataSetChanged();
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
    }

    //布局的初始化
    private void initView(){
        swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swiperefresh);
        swipeRefreshLayout.setOnRefreshListener(this);
        swipeRefreshLayout.setColorSchemeColors(getResources().getColor(R.color.blue_light), getResources().getColor(R.color.green_light), getResources().getColor(R.color.orange_light), getResources().getColor(R.color.red_light));
        recyclerView= (BaseRecyclerView) findViewById(R.id.recycleview);
        recyclerView.setListener(this);
        textView= (TextView) findViewById(R.id.text);
    }

    //数据的初始化
    private void initData(){
        //recyclerView 的相关初始化
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        //SimpleItemDecoration 的第一个参数代表item距离左右以及上下的距离,第二个参数用于判断水平最后一个item(多列的情况)
        //第二个参数的值要和StaggeredGridLayoutManager的第一个参数的值相等
        recyclerView.addItemDecoration(new SimpleItemDecoration(40,1));
        View header= LayoutInflater.from(this).inflate(R.layout.recyclerview_head,null);
        lists=new ArrayList<>();
        for(int i=0;i<10;i++){
            Data data=new Data();
            data.setText("我是初始化的数据"+i);
            lists.add(data);
        }
        newsAdapter =new NewsAdapter(lists);
        newsAdapter.setListener(this);
        baseRecyclerViewAdapter = new BaseRecyclerViewAdapter<>(newsAdapter);
        //添加头部
        baseRecyclerViewAdapter.addHeader(header);
        recyclerView.setAdapter(baseRecyclerViewAdapter);
    }

    //刷新的监听
    @Override
    public void onRefresh() {
        handler.sendEmptyMessageDelayed(0, 2000);
    }

    //adapter的item的点击监听
    @Override
    public void click(int position) {
        ToastUtils.shortToast(this,lists.get(position).getText());
    }

    //加载的监听
    @Override
    public void loadMore() {
        AnimationUtils.showAndHide(textView,"正在加载数据...");
        handler.sendEmptyMessageDelayed(1,2000);
    }
}

关于上拉加载的实现

自定义上拉加载的recyclerview,这里判断上拉操作时事件action_move里要获得
手指位置,如果结束位置小于开始位置,就是上拉,且上拉后还要确定当前屏幕最后一项数据就是初始化数据里的最后一项才执行listener

public class MyRecyclerView extends RecyclerView {

    //最后一个可见的布局的位置
    
    private int lastVisibleItemPosition;
    private onLoadMoreListener listener;
    private boolean isInit;//是否初始化
    private BaseRecyclerViewAdapter baseRecyclerViewAdapter;
    private float startY;//手指开始的位置
    private float endY;//手指结束的位置
    public static boolean isLoading;//避免重复加载

    public BaseRecyclerView(Context context) {
        this(context,null,0);
    }

    public BaseRecyclerView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs,0);
    }

    public BaseRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        Adapter adapter = getAdapter();
        if (!(adapter instanceof BaseRecyclerViewAdapter)) {
            throw new IllegalArgumentException("the adapter must extents BaseRecyclerViewAdapter");
        }
        baseRecyclerViewAdapter = (BaseRecyclerViewAdapter) adapter;

    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        LayoutManager layoutManager = getLayoutManager();
        if (layoutManager instanceof LinearLayoutManager) {
            lastVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastCompletelyVisibleItemPosition();
        }else if (layoutManager instanceof GridLayoutManager) {
            lastVisibleItemPosition = ((GridLayoutManager) layoutManager).findLastCompletelyVisibleItemPosition();
        }else if (layoutManager instanceof StaggeredGridLayoutManager) {
            int[] last = null;
            if (!isInit) {
                last = new int[((StaggeredGridLayoutManager) layoutManager).getSpanCount()];
                isInit = true;
            }
            int[] lastVisibleItemPositions = ((StaggeredGridLayoutManager) layoutManager).findLastCompletelyVisibleItemPositions(last);
            for (int i : lastVisibleItemPositions) {
                lastVisibleItemPosition = i > lastVisibleItemPosition ? i : lastVisibleItemPosition;
            }
        }
        switch (ev.getAction()){
            case MotionEvent.ACTION_DOWN:
                startY=ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                //当正在执行加载的操作时,屏蔽掉多余的加载操作,直至该加载完成之后执行第二次加载的操作
                if(!isLoading){
                    endY=ev.getY();
                    //此时滑动到底部并且为上拉的动作,执行加载的操作方法
                    if(( endY-startY) < 0 && lastVisibleItemPosition == baseRecyclerViewAdapter.getItemCount() -1 ){
                        if(listener==null){
                            break;
                        }
                        listener.loadMore();
                        isLoading=true;
                    }
                }
                break;
            case MotionEvent.ACTION_UP:
                startY=0;
                endY=0;
                break;
            case MotionEvent.ACTION_CANCEL:
                startY=0;
                endY=0;
                break;
        }
        return super.dispatchTouchEvent(ev);
    }

    public interface onLoadMoreListener{
        void loadMore();
    }

    public void setListener(onLoadMoreListener listener){
        this.listener=listener;
    }

}

自定义加载时的动画提示

    //提示信息的显示动画以及隐藏
    //这里在myRecyclerView中定义了一个是否正在加载的变量,这样可以避免用户不断上拉时后台一直传输数据 
    public static void showAndHide(final TextView textView , String message){
        textView.setVisibility(View.VISIBLE);
        textView.setText(message);
        textView.setAnimation(moveToViewLocation());
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                textView.setVisibility(View.GONE);
                textView.setAnimation(moveToViewBottom());
                MyRecyclerView.isLoading=false;
            }
        },2000);
    }

我的参考:https://www.easydone.cn/2015/...
http://blog.csdn.net/leilifen...
大神的实现:https://github.com/Chanven/Co...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67142.html

相关文章

  • 安卓易学,爬坑不易—腾讯大佬RecyclerView局部刷新爬坑之路

    摘要:前言安卓开发者都知道,比要灵活的多,但不可否认的里面的坑也同样埋了不少人。下面让我们看看腾讯开发工程师用实例讲解自己踩坑时的解决方案和心路历程。 前言 安卓开发者都知道,RecyclerView比ListView要灵活的多,但不可否认的里面的坑也同样埋了不少人。下面让我们看看腾讯开发工程师用实例讲解自己踩坑时的解决方案和心路历程。 话说有图有真相,首先来对比一下局部刷新前后的效果: 优...

    mushang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<