Android开发Android技术知识Android开发经验谈

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

2018-10-02  本文已影响6人  wishes丶啊

看懂本文需要对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了。可以按照需求进行具体的操作。

上一篇 下一篇

猜你喜欢

热点阅读