Android RecyclerView 加载更多数据 及 不同类型itemView的使用

在Android5.0中 新推出了 一个 SwipeRefreshLayout 可以实现下拉刷新的功能 但是它并没有提供上拉刷新的实现 所以在使用 SwipeRefreshLayout +RecyclerView 的时候 如果想实现上拉加载数据的功能 就必须 自己实现 其中最简单的方法 无非就是将 RecyclerView的最后一个item设置成 加载更多数据的样式 点击可以请求网络 加载更多数据 这就是涉及到RecyclerView的不同子布局的设置,以往使用ListView使用的比较熟练,现在使用RecyclerView 还是废了一点点的事的
出现的问题 是 最后一个加载更多数据的item 不居中的问题
它不居中的原因 比较清楚 是因为 RecyclerView在设置 item的时候 会 判断item是否有父布局 也就是

View view = View.inflate(getActivity(), R.layout.uppull_refresh, null);

上述代码的最后一个参数是否是null 如果是的话 会把LayoutParams 设置为null 加载布局时会把View的 LayoutParams 设为默认的 也就是 width为 wrap_content 这样也就导致了 无法居中

可是我一直不明白的是 为什么其他的item’可以居中 还需要探索 待我弄完当前手中的项目 再去研究下RecyclerView的源码 再来总结

那么如何解决最后一个item无法居中的问题呢 ?
最初的时候 我试图获取最后一个item的View的LayoutParams 然后设置它的width为Match_parent 也就是如下代码

view.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;

但是程序运行时报了空指针异常 说是view.getLayoutParams()为空 因为在执行到这一步时 由于parent为null 所以 LayoutParams也为null
因此采用另一种方法 直接给它设置一个LayoutParams就可以了

ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                view.setLayoutParams(params);

这样就解决了 不居中的问题

下面就看看我是怎么实现的不同类型布局的实现吧 代码如下 :

 class MyProjectAdapter extends RecyclerView.Adapter {
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

            if (viewType == 2) {
                View view = View.inflate(getActivity(), R.layout.uppull_refresh, null);
                ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                view.setLayoutParams(params);
                return new ListViewLastHolder(view);
            } else {
                View view = View.inflate(getActivity(), R.layout.item_my_project, null);
                return new ListViewHolder(view);
            }
        }

        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            if (holder instanceof ListViewHolder) {
                ((ListViewHolder) holder).setData(position);
            } else if (holder instanceof ListViewLastHolder) {
                ((ListViewLastHolder) holder).setData(position);
            }
        }

        @Override
        public int getItemViewType(int position) {
            if (curlists.size() == position) {
                return 2;
            }
            return super.getItemViewType(position);
        }
        @Override
        public int getItemCount() {
            return curlists.size()+1;
        }

之后 设置最后一个item的点击事件 即可

如果想实现的更高级一点 可以给最后一个item 设置一些动画 比如加载时的动画 加载完毕的退出动画 之类的 或者也可以 根据手势的滑动 来进行数据的刷新 等 最后还可以重写 RecyclerView来 自己自定义一下 更方便使用

你可能感兴趣的:(开发中遇到的问题)