SwipeRefreshLayout+RecyclerView 下拉刷新

Android开发 解决RecyclerView in SwipeRefreshLayout触发下拉刷新的bug Android开发 解决RecyclerView in SwipeRefreshLayout触发下拉刷新的bug首先我们来看一下会遇到的问题: 我们知道, SwipeRefreshLayout 会监听滑动操作,并相应触发下拉刷新,如果布局文件中内含了可滑动的控件,如ScrollView等,则很有可能会在错误的时候触发下拉刷新(譬如当你下拉页面想要浏览上方内容), 好消息是所有AbsListView 阅读详情

SwipeRefreshLayout 是v4包中的控件,
RecyclerView 是v7包中的控件,替代了ListView,强制使用ViewHolder。
这里写图片描述

Demo 地址:https://github.com/SunnyLine/SwipeRefreshAddRecyclerView

Layout

<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/swipe_refresh_widget"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical" />

</android.support.v4.widget.SwipeRefreshLayout>

MainActivity.class

@@ -0,0 +1,109 @@
package com.swipe.recycler;

import android.content.Context;
import android.graphics.Color;
import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class MainActivity extends AppCompatActivity {

    private SwipeRefreshLayout mSwipeRefreshWidget;
    private RecyclerView mRecyclerView;
    CatNamesRecyclerViewAdapter mAdapter;
    private String[] colors = new String[]{"#ff00ddff", "#ff99cc00", "#ffcc0000",
            "#ffffbb33", "#ffefefef", "#ff0099cc"
            , "#ffff8800", "#ffaa66cc", "#ffff4444"};

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

        mSwipeRefreshWidget = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_widget);
        mRecyclerView = (RecyclerView) findViewById(R.id.list);

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);

        mRecyclerView.setLayoutManager(linearLayoutManager);
        mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
        mAdapter = new CatNamesRecyclerViewAdapter(this);
        mRecyclerView.setAdapter(mAdapter);
        mSwipeRefreshWidget.setColorSchemeResources(android.R.color.holo_blue_bright, android.R.color.holo_green_light,
                android.R.color.holo_orange_light, android.R.color.holo_purple);
        mSwipeRefreshWidget.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                refreshContent();
            }
        });
    }

    private void refreshContent() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                mAdapter.refreshContent();
                mAdapter.notifyDataSetChanged();
                mSwipeRefreshWidget.setRefreshing(false);
            }
        }, 5000);
    }

    class CatNamesRecyclerViewAdapter extends RecyclerView.Adapter<CatNamesRecyclerViewAdapter.CatNamesViewHolder> {

        private Context mContext;
        List<String> mCatNames;

        public CatNamesRecyclerViewAdapter(Context context) {
            mContext = context;
            mCatNames = Arrays.asList(mContext.getResources().getStringArray(R.array.day));
            Collections.shuffle(mCatNames);
        }

        public class CatNamesViewHolder extends RecyclerView.ViewHolder {
            TextView mCatNameTextView;

            public CatNamesViewHolder(View itemView) {
                super(itemView);
                mCatNameTextView = (TextView) itemView.findViewById(R.id.textView);
            }
        }

        public void refreshContent() {
            Collections.shuffle(mCatNames);
        }

        @Override
        public CatNamesViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            View inflatedView = LayoutInflater.from(mContext).inflate(R.layout.item, viewGroup, false);
            return new CatNamesViewHolder(inflatedView);
        }

        @Override
        public void onBindViewHolder(CatNamesViewHolder viewHolder, int i) {
            String catName = mCatNames.get(i);
            viewHolder.mCatNameTextView.setText(catName);
            viewHolder.mCatNameTextView.setBackgroundColor(Color.parseColor(colors[new Random().nextInt(9)]));
        }

        @Override
        public int getItemCount() {
            return mCatNames.size();
        }
    }
}

DividerItemDecoration.class RecyclerView 设置Divider(此类是从GitHub上 下载的)

@@ -0,0 +1,128 @@
package com.swipe.recycler;

/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;

/**
 * This class is from the v7 samples of the Android SDK. It's not by me!
 * <p/>
 * See the license above for details.
 */
public class DividerItemDecoration extends RecyclerView.ItemDecoration
{

    private static final int[] ATTRS = new int[] { android.R.attr.listDivider };

    public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;

    public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;



    private Drawable mDivider;

    private int mOrientation;

    public DividerItemDecoration(Context context, int orientation)
    {
        final TypedArray a = context.obtainStyledAttributes(ATTRS);
        mDivider = a.getDrawable(0);
        a.recycle();
        setOrientation(orientation);
    }

    public void setOrientation(int orientation)
    {
        if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST)
        {
            throw new IllegalArgumentException("invalid orientation");
        }
        mOrientation = orientation;
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent)
    {
        Log.v("recyclerview - itemdecoration", "onDraw()");
         if (mOrientation == VERTICAL_LIST) {
                drawVertical(c, parent);
            } else {
                drawHorizontal(c, parent);
            }
    }

    public void drawVertical(Canvas c, RecyclerView parent)
    {
        final int left = parent.getPaddingLeft();
        final int right = parent.getWidth() - parent.getPaddingRight();

        final int childCount = parent.getChildCount();

        for (int i = 0; i < childCount; i++)
        {
            final View child = parent.getChildAt(i);
            RecyclerView v = new RecyclerView(
                    parent.getContext());
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                    .getLayoutParams();
            final int top = child.getBottom() + params.bottomMargin;
            final int bottom = top + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    public void drawHorizontal(Canvas c, RecyclerView parent)
    {
        final int top = parent.getPaddingTop();
        final int bottom = parent.getHeight() - parent.getPaddingBottom();

        final int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++)
        {
            final View child = parent.getChildAt(i);
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                    .getLayoutParams();
            final int left = child.getRight() + params.rightMargin;
            final int right = left + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    @Override
    public void getItemOffsets(Rect outRect, int itemPosition,
            RecyclerView parent)
    {
        if (mOrientation == VERTICAL_LIST)
        {
            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
        } else
        {
            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
        }
    }
}
Android 使用SwipeRefreshLayout实现RecyclerVeiw的下拉刷新和上拉加载 实现下拉刷新和上拉加载的完整代码如下: 一、布局文件代码如下: 主界面main.xml代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas. 阅读详情

相关推荐

SwipeRefreshLayout配合RecyclerView实现下拉刷新和上拉加载更多的Demo源码

SwipeRefreshLayout配合RecyclerView实现下拉刷新和上拉加载更多以及没有数据的显示这个demo的源码,详情请参看:http://blog.youkuaiyun.com/lovexieyuan520/article/details/50589412

Android SwipeRefreshLayout+RecyclerView实现下拉刷新和上拉加载

一、SwipeRefreshLayout简介 SwipeRefreshLayout作为谷歌官方推荐的下拉刷新控件,在实际开发中,经常都会遇到下拉刷新、上拉加载更多的情形。,该控件集成自ViewGroup在support-v4兼容包下。 SwipeRefrshLayout常用的几个方法如下: isRefreshing():判断当前的状态是否是刷新状态。 setColorSchemeResources(int… colorResIds):设置下拉进度条的颜色主题,参数为可变参数,并且是资源id,可以设置多种不

wq892373445的博客 2396

SwipeRefreshLayout+RecyclerView刷新加载自定义控件封装

SwipeRefreshLayout+RecyclerView刷新加载封装并内嵌RecyclerView和EmptyLayout控件,可自定义头布局和尾布局

SwipeRefreshLayout + RecyclerView 实现上拉加载下拉刷新

一丶效果图 二丶概述 RecyclerVIew的上拉加载,下拉刷新网上也有很多,包括github上的开源也有非常好用的,这里整理demo作为一个开始

行动者&&职业化 5837

使用SwipeRefreshLayout和RecyclerView实现仿“简书”下拉刷新和上拉加载更多

使用SwipeRefreshLayout和RecyclerView实现仿“简书”下拉刷新和上拉加载更多 对应博客地址:http://blog.youkuaiyun.com/leoleohan/article/details/50989549 对应Github地址:https://github.com/leoleohan/RefreshDemo

SwipeRefreshLayout + RecyclerView上拉刷新下拉加载

SwipeRefreshLayout +RecyclerView上拉刷新下拉加载

SwipeRefreshLayout +RecyclerView 实现下拉刷新上拉加载

看一下实际Activity。

TSBBjc 452

SwipeRefreshLayout+RecyclerView实现上拉刷新和下拉刷新功能

SwipeRefreshLayout 是谷歌公司推出的用于下拉刷新的控件,SwipeRefreshLayout已经被放到了sdk中,在Version 19.1之后SwipeRefreshLayout 被放到support v4中。 源码在SDK\sdk\extras\android\support\v4\src\java\android\support\v4\widget\SwipeRefreshLayout.java 谷歌公司只提供了下拉刷新的功能,RecyclerView的出现基本就是为了替代ListView,GridView的。 今天说一下最常见的下拉刷新  和 上拉刷新的功能。 布局文

SwipeRefreshLayout(下拉刷新)与RecyclerView之简单使用<一>

一,简意:SwipeRefreshLayout是V4支持包中提供的一个新的控件,它可以实现下拉刷新的功能。但是缺点是没有实现上拉加载更多。但是网上有很多开发者对它进行加强,使得它可以实现上拉加载。 二,用途:可以包裹一个任何可以滚动的内容(ListView GridView ScrollView RecyclerView),可以自动识别垂直滚动手势。使用起来非常方便 三,方法: 1.将需要下

小样 1085

10.2 在新能源、储能及电网节点的应用实践

构网型变流器技术在电力系统中的应用进展 构网型变流器技术正从理论研究走向规模化工程应用,为新能源并网提供主动支撑能力。该技术在光伏电站采用"部分构网"混合架构,由构网单元实现黑启动和弱网稳定;在风电场利用叶轮动能提供惯量响应。储能系统是理想的构网载体,可提供快速调频和动态电压支撑。在电网节点,构网型STATCOM可增强弱电网电压稳定性,大容量变流器可替代传统调相机。当前面临标准滞后、宽频振荡风险等共性挑战,需在可靠性、经济性间取得平衡。系统级协调控制和精确阻抗建模是应用成功的关键。

技术工作者 1112

MaixCAM2 4K AI相机硬件解析与开发实战

嵌入式AI视觉开发中,边缘计算设备的选择直接影响项目落地效果。以NPU为核心的AI加速技术通过专用指令集优化,可在低功耗下实现10+TOPS算力,典型应用包括工业质检、智能门禁等实时场景。MaixCAM2作为新一代4K AI相机,搭载AX630 SoC芯片,其双核Cortex-A53与NPU的异构架构,在运行YOLOv11n模型时可达113FPS,显著优于传统方案。开发时需注意模型量化部署技巧,如INT8量化需500+张校准图片覆盖多光照条件,避免准确率下降。设备扩展性方面,PMOD接口支持热成像、ToF传

weixin_30819085的博客 691

RecyclerView+SwipeRefreshLayout实现下拉刷新列表

一:RecyclerView的用法:  RecyclerView是google在2014年I/O大会上提出新的用于取代ListView的组件,是 android-support-v7-21 版本中新增的一个 Widgets,它的灵活性与可替代性比listview更好。 使用 RecyclerView首先应该认识两个要点: 1.Adapter:使用RecyclerView之前,需要继承Re

Crazyfzw的博客 1542

高等数学/概率论/数理统计/线性代数/离散数学面试-核心概念-问题理解

特征值与特征向量是线性代数中的概念,它们与线性变换有关。在线性变换中,如果存在非零向量 v ,使得当该向量通过变换后,其方向不变,只是长度发生了变化,那么这个向量 v 就是特征向量。而这个长度变化的比例因子,即变换前后向量长度的比值,称为特征值。数学公式表示:通俗易懂的解释:想象一下,你有一个可以伸缩的橡皮筋,这个橡皮筋可以代表一个向量。现在,你有一个特殊的机器,它可以改变橡皮筋的形状,但不会改变它延伸的方向。当你把橡皮筋放入机器中,机器会拉伸或压缩橡皮筋,但橡皮筋的方向保持不变。

m0_64198455的博客 2293

Android RecyclerView + SwipeRefreshLayout 分页、下拉刷新

自己的

买轮班的专栏 2450

vcenter server6.0上vmware inventory 、virtualvcenter等服务无法开启

描述:一天,vcenter访问不了,因此Windows远程到vcenter server上。相关服务未开启,开启virtualCenter server服务提示相关依赖服务未开启,于是开启依赖项服务Inventory服务报错。然后打算使用 C:\Program Files\VMware\vCenter Server\bin\servcivce-control来开启vmware服务 1....

Pespi_Co1a的博客 3070

Windows 10 下 Nacos 3.0.2 单机版保姆级安装教程(含JDK 17配置与MySQL 8.0连接避坑)

本文提供Windows 10下Nacos 3.0.2单机版的详细安装教程,涵盖JDK 17配置、MySQL 8.0连接优化及生产级安全设置。通过步骤详解和常见问题解决方案,帮助开发者快速完成Nacos的安装与配置,确保服务发现与配置管理的高效运行。

weixin_29237635的博客 320

实现上拉加载,下拉刷新。通过SwipeRefreshLayout+RecyclerView

SwipeRefreshLayout SwipeRefreshLayout是一个下拉刷新的控件。并且提供了一些方法: (1)setOnRefreshListener(OnRefreshListener): 为布局添加一个Listener,就是那个下拉的监听,方法里面就是实现发生了下拉后要做什么的操作。 (2)setRefreshing(boolean): 显示或隐藏刷新进度条 (3)is...

faskjj的博客 2494

基于Simulink的鲸鱼优化算法(WOA)MPPT仿真

摘要:本文介绍了基于Simulink的鲸鱼优化算法(WOA)在光伏MPPT控制中的应用。WOA模拟座头鲸的"气泡网捕食策略",通过包围猎物、螺旋收缩和随机搜索三阶段动态平衡全局探索与局部开发能力,有效解决局部阴影导致的多峰P-V曲线问题。文章详细讲解了WOA-MPPT的Simulink建模过程,包括多峰光伏阵列建模、WOA控制器实现和Boost变换器控制。仿真结果显示,在三种典型工况下,WOA-MPPT的追踪效率>99.3%,动态响应时间<0.15s,性能优于传统算法。最后提出了混合WO

amy_mhd的博客 72

SwipeRefreshLayout+RecyclerView实现下拉刷新

SwipeRefreshLayout+RecyclerView实现下拉刷新另外还使用了CardView(一个容器类布局,它继承自FrameLayout)。 效果图如下: 具体的使用: 1.CardView 首先,引入依赖: compile 'com.android.support:cardview-v7:23.3.0'接着,在布局中引用,需要添加新的名字空间xmlns:card_view="ht

imtianx个人博客 490

【科学文献计量】标准参考出版年谱(Standard RPYS)和多维参考出版年谱(Multi RPYS)

@[TOC](标准参考出版年谱(Standard RPYS)和多维参考出版年谱(Multi RPYS)) 1 标准参考出版年谱与多维参考出版年谱 1.1 标准参考出版年谱(Standard RPYS) 标准参考出版年谱(Standard Reference Publication Year Spectroscopy)是由Marx, Bornmann, Barth, and Leydesdorff(2014)和Marx and Bornmann(2014)提出的一种量化历史出版物对研究领域影响的方法。该方法通

lys_828的博客 1103

自动驾驶大模型---小鹏汽车VLA大模型

随着自动驾驶技术的进步,小鹏汽车正通过云端大模型蒸馏技术,将72B参数的VLA大模型轻量化后部署到车端,以提升自动驾驶系统的智能和安全性。这种技术路线不仅解决了“模态不统一”的问题,还通过强化学习增强了模型的表现。

智能汽车人的博客 2235

SwipeRefreshLayout+RecyclerView下拉刷新

RecyclerView与SwipeRefreshLayout结合可以实现下拉刷新。 布局文件: <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/id_swipe" android:layout_width="wrap_content" android:layout_h

Julyraining的博客 579

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

基于recyclerview的下拉刷新---SwipeRefreshLayout

1.效果展示 2.实现过程 (1)修改activity_main.xml,把SwipeRefreshLayout放在RecyclerView的外层,并把app:layout_behavior="@string/appbar_scrolling_view_behavior"这句代码放到SwipeRefreshLayout里。 <?xml version="1.0" encoding="utf-8"?> <androidx.drawerlayout.widget.DrawerLayout x

一粒程序米 411

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

新版下拉刷新swiperefreshlayout+recyclerview

最近有个模块觉得很好,于是小研究了下,不喜勿喷。之前一直徘徊ListView,GridView什么的。自安卓5.0之后,谷歌新推出了下拉刷新的控件SwipeRefreshLayout,以及针对ListView,GridView更新的RecyclerView。本着好用的心态,简单研究了下新控件的用法,于是写了一个Demo。 我的胆子越来越大了,老板就在旁边经过,上班时间写博客。 话不多说,直接步

忍者神龟的博客 737

下拉刷新与RecyclerView 滑动冲突(SwipeRefreshLayout与RecyclerView 滑动冲突)

SwipeRefreshLayout 嵌套RecyclerView 在下滑上滑的时候,有时会互相冲突。先说网上的解决方式是: 给RecyclerView 添加滑动监听(addOnScrollListener),在onScrolled里获取第一个item的top,当上下滑动时top只为负数,当第一个item完全展示出来时top为0。 当top为0时。说明滑动到头了,再把SwipeRefreshLayout的Enabled设置为true...... RecyclerView 的id是home_rec...

NewActivity的博客 1444

SwipeRefreshLayout和RecyclerView整合实现下拉刷新

SwipeRefreshLayout是google提供的一个下拉刷新组件,其实是一个布局,此布局内只有有一个直接子View。使用此组件需要实现SwipeRefreshLayout.OnRefreshListener接口,在onRefresh方法中实现数据的更新操作。 RecyclerView用来替代ListView,使用这两个组件实现了下拉刷新列表数据的功能。 开始时: 下拉刷新进行中:

hxltech的专栏 620
上一篇: 购物车-----ListView 中CheckBox混乱
下一篇: Android Socket 聊天室
hello_12413
博客等级 码龄14年 8粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值