美文网首页Android开发Android技术知识Android开发经验谈
自定义Recycler上拉加载刷新 谁都看得懂

自定义Recycler上拉加载刷新 谁都看得懂

作者: wishes丶啊 | 来源:发表于2018-10-02 11:51 被阅读6次

    看懂本文需要对RecyclerView和RecyclerAdapter的基本使用有了解。也就是会用就行。
    效果就是滑动最下面的item,就加载更多数据,并且最后一个item跟普通的item不一样。


    微信图片_20181002115043.png

    会判断是否显示到了最后一个,进行数据加载
    为了缩短篇幅,下面两个代码没有给出
    1.item布局简单,就是一个TextView,分别是R.layout.cell_string和R.layout.cell_load
    2.两个ViewHolder代码也简单,里面也只有一个TextView对象
    首先准备recyclerAdapter,名字就叫StringAdapter

    public class StringAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
        // 这个item分为两种 一种是正常显示数据的item,一种是显示“正在加载”的item
        public static final int NORMAL_ITEM = 1;    // 正常显示数据的item
        public static final int LOADER_ITEM = 2;    // "正在加载" 的 item
        List<String> mData;
    
        // 用构造方法赋值
        public StringAdapter(List<String> strings){
            this.strings = strings;
        }
    
        @Override
        public int getItemCount() {
            // 因为除了显示基本的数据外  还需要添加一个显示“正在加载”的item,所以要+1
            return strings.size() + 1;
        }
    
        // 重要 这是RecyclerView.Adapter的一个方法,返回值就作为onCreateViewHolder的第二个参数
        @Override
        public int getItemViewType(int position) {
            if (position == strings.size()) {   // 如果是最后一个item 就显示“正在加载”的item
                return LOADER_ITEM;
            }
            return NORMAL_ITEM;  // 正常情况下 显示普通的item
        }
    
        /** 
         *  第二个参数就是上面方法(getItemViewType)返回的 
         *  这个方法的作用是返回一个ViewHolder 用来显示
         */
        @Override
        public RecyclerView.ViewHolderon CreateViewHolder(ViewGroup parent,int viewType) {
            Context context=parent.getContext();  //获取上下文
            LayoutInflater inflater = LayoutInflater.from(context);
    
            // 根据不同的viewType来返回不同的ViewHolder,从而显示不同的Item
            if (viewType == NORMAL_ITEM) {    // 正常的item
                View view = inflater.inflate(R.layout.cell_string, parent, false);
                return new StringHolder(view);  // 使用正常的Holder
            } else {  // “正在加载” item
                View view = inflater.inflate(R.layout.cell_load, parent, false);
                return new LoadHolder(view);    // 使用 “正在加载”的Holder
            }
        }
    
        @Override
        public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
            // 我们只返回了两种ViewHolder 分别进行不同的操作
            if (holder instanceof StringHolder) {  
                String s = strings.get(position);  // 从集合中获取数据然后显示
                ((StringHolder) holder).textView.setText(s);
            } else if (holder instanceof LoadHolder) {
                ((LoadHolder) holder).textView.setText("正在加载哦...");
            }
        }
    }
    

    ViewHolder很简单,其中都只有一个TextView

    接下来看RecyclerView的初始化

    public class MainActivity extends Activity{
    
        private int lastVisiableItem;  //当前RecyclerView的最下面一个可见的Item位置
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            //...此处省略无关代码
    
            RecyclerView recyclerView=findViewById(R.id.recycler);
            // 设置LayoutManager之后要使用
            final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
            recyclerView.setLayoutManager(layoutManager);
    
            StringAdapter adapter=new StringAdapter(list);
            recyclerView.setAdapter(adapter);
            // 以上都是基本操作 重点看下面的代码  给recyclerView添加滑动事件监听
            recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener(){
                /**
                 * 当RecyclerView滑动状态改变时会回调此方法
                 * newState就是当前状态 分别有三种
                 */
                @Override
                public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                    super.onScrollStateChanged(recyclerView, newState);
                    // new Sate的状态
                    // RecyclerView.SCROLL_STATE_IDLE:  滑动已经停止
                    // RecyclerView.SCROLL_STATE_DRAGGING: 在手指的操作下滑动
                    // RecyclerView.SCROLL_STATE_SETTLING:  在惯性的作用下滑动
    
                    // 当RecyclerView停止在最后一个Item(LoadViewHodler)时,要加载数据
                    if(newState==RecyclerView.SCROLL_STATE_IDLE && 
                                    lastVisibleItem+1==adapter.getItemCount()){
                        // 这样条件成立的情况下就是显示了最后一个"正在加载"的ViewHolder
                        // TODO 此处可以进行数据加载等各种操作
                    }
                }
    
                /**  
                 *  RecyclerView一滑动就回调此方法 我们可以在这个方法里面获取
                 *  RecyclerView最后一个显示Item的位置
                 */
                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);
                    // 获取最后一个可见的item
                    lastVisibleItem = layoutManager.findLastVisibleItemPosition();
                }
            });
        }
    }
    

    这样就可以监听是否滑倒最后一个item了。可以按照需求进行具体的操作。

    相关文章

      网友评论

        本文标题:自定义Recycler上拉加载刷新 谁都看得懂

        本文链接:https://www.haomeiwen.com/subject/ltwooftx.html