Android RecycleView上拉加载

上拉加载的思路就是实现OnScrollListener

<pre name="code" class="java"> mRecyclerView.addOnScrollListener(new OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);

                if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == list.size()) {
		//这里进行加载数据操作                    
                }

            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
            }
        });


 
 
1、当RecycleView当前可见项的最后一个+1=列表的长度时候。比如列表长度为10,当前可见(从0开始计算)的最后一个是9,就是最后一个了。 

2、newState是一个什么东西?

public void stopScroll() {
        setScrollState(SCROLL_STATE_IDLE);
        stopScrollersInternal();
    }


 
   <span style="font-size:18px;">这是来自RecyclerView的代码片段,从上面可以看出。当RecyclerView停止刷新(上拉或者下拉)的时候设置RecyclerView的状态为SCROLL_STATE_IDLE。当用户停止刷新并且当前可见的item是最后一个就显示上拉加载</span>
<span style="font-size:18px;">
</span>
<span style="font-size:18px;">
</span>
<span style="font-size:18px;">activity代码</span>
<span style="font-size:18px;"></span><pre name="code" class="java">package com.qd.wangxm.recycleviewloadmore;

import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.OnScrollListener;
import android.util.Log;
import android.widget.Toast;

import com.qd.wangxm.recycleviewloadmore.adapter.MyAdapter;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private MyAdapter mAdapter;

    private LinearLayoutManager linearLayoutManager;
    private int lastVisibleItem;

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

        linearLayoutManager = new LinearLayoutManager(this);
        final List<String> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            list.add("第" + i + "个数据项");
        }

        mRecyclerView = (RecyclerView) findViewById(R.id.rv_list);
        mAdapter = new MyAdapter(list, this);
        RecyclerView.LayoutManager manager = new GridLayoutManager(this, 1, GridLayoutManager.VERTICAL, false);
        mRecyclerView.setLayoutManager(linearLayoutManager);
        mRecyclerView.setAdapter(mAdapter);

        mRecyclerView.addOnScrollListener(new OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);

                if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem  == list.size() && mAdapter.getFooterType() == MyAdapter.FOOTER_LOAD_MORE) {
                    mAdapter.loading();
                    //在这里加载数据
                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            List<String> newDatas = new ArrayList<String>();
                            for (int i = 0; i < 5; i++) {
                                int index = i + 1;
                                newDatas.add("more item" + index);
                            }
                            list.addAll(newDatas);
                            //加载完数据调用addItem
                            mAdapter.addItem(list);
                        }
                    }, 1000);
                }

            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
            }
        });


    }

    public void showToast(String msg) {
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
        Log.e("-------------", msg);
    }
}
</pre>adapter代码<pre>
<span style="font-size:18px;">
</span><pre name="code" class="java">package com.qd.wangxm.recycleviewloadmore.adapter;


import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.qd.wangxm.recycleviewloadmore.R;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by WangXM on 2016/5/30.
 */
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private static final int TYPE_ITEM = 0;  //普通Item View
    private static final int TYPE_FOOTER = 1;  //顶部FootView
    public static final int FOOTer_LOADING=1;
    public static final int FOOTER_LOAD_MORE=2;
    public static final int FOOTER_NO_ITEM=0;

    private int footerType=FOOTER_LOAD_MORE;

    private List<String> mList = new ArrayList<>();
    private Context mContext;

    public MyAdapter(List<String> list, Context context) {
        mList = list;
        mContext = context;
    }
    public int getFooterType(){
        return footerType;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_ITEM) {
            View view = LayoutInflater.from(mContext).inflate(R.layout.item_myadapter, parent, false);
            ItemHolder holder = new ItemHolder(view);
            return holder;
        } else {
            View view = LayoutInflater.from(mContext).inflate(R.layout.item_foot, parent, false);
            FootHolder holder = new FootHolder(view);
            return holder;
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (position < mList.size()) {
            ((ItemHolder) holder).tvContent.setText(mList.get(position));
        } else {

            if (footerType==FOOTER_LOAD_MORE)
                ((FootHolder) holder).tvContent.setText("上拉加载更多数据");
            else if (footerType==FOOTER_NO_ITEM)
                ((FootHolder) holder).tvContent.setText("已经是最后一页,没有数据了");
            else
                ((FootHolder) holder).tvContent.setText("正在加载更多数据。。。");
        }
    }


    @Override
    public int getItemCount() {
        return mList.size() + 1;
    }

    @Override
    public int getItemViewType(int position) {
        if (position < mList.size()) {
            return TYPE_ITEM;
        } else {
            return TYPE_FOOTER;
        }
    }

    public void loading(){
        this.footerType=FOOTer_LOADING;
        notifyDataSetChanged();
    }

    public void  addItem(List<String> list){
//        this.mList.clear();
//        mList.addAll(list);
        this.footerType=FOOTER_LOAD_MORE;
        notifyDataSetChanged();

    }
    public void  addItemNoNext(List<String> list){
        this.mList.clear();
        mList.addAll(list);
        this.footerType=FOOTER_NO_ITEM;
        notifyDataSetChanged();

    }

    class ItemHolder extends RecyclerView.ViewHolder {
        public TextView tvContent;

        public ItemHolder(View itemView) {
            super(itemView);
            tvContent = (TextView) itemView.findViewById(R.id.tv_context);
        }
    }
    class FootHolder extends RecyclerView.ViewHolder {
        public TextView tvContent;

        public FootHolder(View itemView) {
            super(itemView);
            tvContent = (TextView) itemView.findViewById(R.id.tv_context);
        }
    }


}


 

BaseAdapter见下文 http://blog.csdn.net/jing85432373/article/details/51682156

</pre><pre code_snippet_id="1702488" snippet_file_name="blog_20160531_4_7186047" name="code" class="java">
</pre><pre>


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仲少

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值