【Android】使用 SwipeRefreshLayout 实现下拉刷新

今天在codepath 上看到一个开源项目 [点击查看]使用到了 SwipeRefreshLayout 实现了下拉刷新,但示例并不完整,于是自己就动手写了下.之前看到郭霖的博客上也有介绍下拉刷新,不过他是纯手动实现的,代码量大,较为繁琐.[点击查看]而使用Android
提供的SwipeRefreshLayout 则大大减少了我们的工作量,当然,学会了使用SwipeRefreshLayout之后还是建议去看看怎样不借助SwipeRefreshLayout从零开始实现"下拉刷新".

SwipeRefreshLayout is a ViewGroup that can hold only one scrollable
view as a child. This can be either a ScrollView or anAdapterView such
as a ListView.

Note: This layout only exists within more recent versions of support-v4 as explained in this
post
. Edit your app/build.gradlefile to include a support library later than version 19:

要注意的是 SwipeRefreshLayout 在 Android 4.4.2(API 19) 的版本才得到支持,因此在建工程的时候最低版本要选 19 之后的.

先看效果:

接下来我就直接上代码了. [其中用到的图片可以下载源码,图片均包含在里面]

布局文件(XML)[activity_main.xml]:

里面就一个ListView,也不要有其他多余的东西

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

    <ListView
        android:layout_marginTop="30dp"
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" >
    </ListView>

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

MainActivity 代码:

package com.demo.mummyding.learnswiperefreshlayout;

import android.app.Activity;
import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import org.json.JSONArray;

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

/**
 * 这里要实现 OnRefreshListener 接口
 */
public class MainActivity extends Activity implements SwipeRefreshLayout.OnRefreshListener{
    private SwipeRefreshLayout swipeContainer;
    ListView listView;
    List<viewItem> list;
    itemAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    /**
     * 下来刷新就会触发执行此方法
     */
    @Override
    public void onRefresh() {
        /**
         * 用Handler().postDelayed 延迟执行
         * 当然,不用延迟也可以,我这里是为了看效果,因为这里刷新哗的一下就没了~
         */
         new Handler().postDelayed(new Runnable() {
             @Override
             public void run() {
                 list.clear();
                 addItems();
                 adapter.notifyDataSetChanged();
                 swipeContainer.setRefreshing(false);
             }
         }, 1000);

        /*
        不用延迟可以直接像下面这样写
         */
        /*
        *  list.clear();
                 addItems();
                 adapter.notifyDataSetChanged();
                 swipeContainer.setRefreshing(false);
                 */
    }

    /**
     * 初始化变量&添加事件监听
     */
    void init(){
        listView = (ListView) findViewById(R.id.list_view);
        swipeContainer = (SwipeRefreshLayout) findViewById(R.id.swipeContainer);
        swipeContainer.setOnRefreshListener(this);
        list = new ArrayList<viewItem>();
        adapter = new itemAdapter(this,R.layout.view_layout,list);
        listView.setAdapter(adapter);
    }

    /**
     * 向ListView添加Item  下面的Item 可以多复制几遍~_~
     */
    void addItems(){
        viewItem addItem = new viewItem("Aaron");
        list.add(addItem);
        addItem = new viewItem("Barton");
        list.add(addItem);
        addItem = new viewItem("Beacher");
        list.add(addItem);
        addItem = new viewItem("Colbert");
        list.add(addItem);
        addItem = new viewItem("Dick");
        list.add(addItem);
        addItem = new viewItem("Gregary");
        list.add(addItem);
        addItem = new viewItem("Francis");
        list.add(addItem);
        addItem = new viewItem("Fitch");
        list.add(addItem);
        addItem = new viewItem("Gordon");
        list.add(addItem);
        addItem = new viewItem("Eugene");
        list.add(addItem);
        addItem = new viewItem("Gregary");
        list.add(addItem);
        addItem = new viewItem("Francis");
        list.add(addItem);
        addItem = new viewItem("Fitch");
        list.add(addItem);
        addItem = new viewItem("Gordon");
        list.add(addItem);
        addItem = new viewItem("Eugene");
        list.add(addItem);
        addItem = new viewItem("Gregary");
        list.add(addItem);
        addItem = new viewItem("Francis");
        list.add(addItem);
        addItem = new viewItem("Fitch");
        list.add(addItem);
        addItem = new viewItem("Gordon");
        list.add(addItem);
        addItem = new viewItem("Eugene");
        list.add(addItem);
        addItem = new viewItem("Gregary");
        list.add(addItem);
        addItem = new viewItem("Francis");
        list.add(addItem);
        addItem = new viewItem("Fitch");
        list.add(addItem);
        addItem = new viewItem("Gordon");
        list.add(addItem);
        addItem = new viewItem("Eugene");
        list.add(addItem);
        addItem = new viewItem("Gregary");
        list.add(addItem);
        addItem = new viewItem("Francis");
        list.add(addItem);
        addItem = new viewItem("Fitch");
        list.add(addItem);
        addItem = new viewItem("Gordon");
        list.add(addItem);
        addItem = new viewItem("Eugene");
        list.add(addItem);
        addItem = new viewItem("Gregary");
        list.add(addItem);
        addItem = new viewItem("Francis");
        list.add(addItem);
        addItem = new viewItem("Fitch");
        list.add(addItem);
        addItem = new viewItem("Gordon");
        list.add(addItem);
        addItem = new viewItem("Eugene");
        list.add(addItem);

    }

}

接下来是两个类 Item类 和Adapter类[这就属于ListView的的基本用法了] 里面做了优化

package com.demo.mummyding.learnswiperefreshlayout;

/**
 * Created by mummyding on 15-7-20.
 */
public class viewItem {
    private String itemName;

    public String getItemName() {
        return itemName;
    }

    public viewItem(String itemName) {
        this.itemName = itemName;
    }
}
package com.demo.mummyding.learnswiperefreshlayout;

import android.content.Context;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import java.util.List;

/**
 * Created by mummyding on 15-7-20.
 */
public class itemAdapter extends ArrayAdapter<viewItem> {

    public itemAdapter(Context context, int resource, List<viewItem> objects) {
        super(context, resource, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;
        ViewHolder viewHolder;
        viewItem item = getItem(position);
        if(convertView == null){
           view = LayoutInflater.from(getContext()).inflate(R.layout.view_layout, null);
            viewHolder = new ViewHolder();
            viewHolder.name = (TextView) view.findViewById(R.id.tv_Name);
            viewHolder.name.setText(item.getItemName());
            view.setTag(viewHolder);
        }else{
            view = convertView;
            viewHolder = (ViewHolder) convertView.getTag();
            viewHolder.name.setText(item.getItemName());
        }

        return view;
    }

    /**
     * 为了减少getView方法中 findViewById 调用次数 而添加的一个辅助类.
     */
    class ViewHolder{
        TextView name;
    }
}

最后还有一个Item View的局部文件[view_layout.xml]

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <ImageView
            android:id="@+id/iv_Uers"
            android:layout_width="60dp"
            android:layout_height="50dp"
            android:layout_marginLeft="10dp"
            android:background="@drawable/user"
            />
        <TextView
            android:id="@+id/tv_Name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/iv_Uers"
            android:gravity="center"
            android:layout_centerInParent="true"
            />
    </RelativeLayout>

</LinearLayout>

完整代码:https://github.com/MummyDing/SwipeRefreshLayout

【转载请注明出处】

Author: MummyDing

出处:http://blog.csdn.net/mummyding/article/category/5651761

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 22:13:15

【Android】使用 SwipeRefreshLayout 实现下拉刷新的相关文章

Android 编程下如何调整 SwipeRefreshLayout 的下拉刷新距离

SwipeRefreshLayout 的下拉刷新距离比较短,并且也没有提供设置下拉距离的 API,但是看 SwipeRefreshLayout 的源码,会发现有一个内部变量 mDistanceToTriggerSync,这个变量决定了触发刷新的下拉距离.下面的代码展示了源码中是如何给这个变量赋值的: final DisplayMetrics metrics = getResources().getDisplayMetrics(); mDistanceToTriggerSync = (int) M

[Android学习系列15]下拉刷新列表实现动态加载

使用google官方的SwipeRefreshLayout 参考: http://blog.csdn.net/easyer2012/article/details/22857807 http://stormzhang.github.io/android/2014/03/29/android-swiperefreshlayout/ http://www.eoeandroid.com/thread-330439-1-1.html http://www.oschina.net/translate/sw

谷歌官方组件SwipeRefreshLayout实现下拉刷新(简洁)

布局文件: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent">

Android打造通用的下拉刷新组件

还记得上一篇 blog 的内容吗?如果不记得建议先去了解一下,Android 事件处理全面剖析 ,因为下拉刷新需要用到手势的处理,而上一篇文章中,对事件处理做了很详细的说明,了解了事件的处理机制,对理解本篇文章有很大的帮助.好了,这里就当大家都已经对事件处理有了一定的了解,开始我们的下拉刷新征程. 还是老规矩,先上效果图,再根据效果图来分析实现的原理: 一 .分析原理 我们都知道,listView 控件为我们提供了 addHeaderView.和 addFootView 的方法,我们通过此方法可

Android实现RecyclerView的下拉刷新和上拉加载更多

Android实现RecyclerView的下拉刷新和上拉加载更多 原文地址:https://www.cnblogs.com/zhujiabin/p/8206176.html

Android SwipeRefreshLayout 官方下拉刷新控件介绍

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24521483 以下App基本都有下拉刷新的功能,曾经基本都使用XListView或者自己写一个下拉刷新,最近Google提供了一个官方的下拉刷新控件SwipeRefreshLayout,我感觉还不错啊,见惯了传统的下拉刷新,这个反而给人耳目一新的感觉(貌似知乎的APP已经使用这样的下拉刷新了). Google也在官方站点给出了V4的兼容包: 顺便看一眼API呗: 和XlistV

android 开发:使用SwipeRefreshLayout实现下拉刷新

SwipeRefreshLayout google官方的下拉刷新控件,我是使用在ListView上的. 定义布局文件: 1 LinearLayout 2 xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="match_parent" 5 android:layout_h

Android如何定制一个下拉刷新,上滑加载更多的容器

前言 下拉刷新和上滑加载更多,是一种比较常用的列表数据交互方式. android提供了原生的下拉刷新容器 SwipeRefreshLayout,可惜样式不能定制. 于是打算自己实现一个专用的.但是下拉刷新和上滑,非常考验对android布局与父子触摸机制的功底,因此参考gitHub上的一个热门的下拉刷新项目 之所以选择他是因为它一个类就完成了所有View的适配,非常的精简强力. 需求 咱对下拉刷新.上滑加载更多的控件,需求如下: 1:下拉刷新,拖动到一定距离,提示文字变成 放手刷新 2:刷新完成

Android实现RecyclerView的下拉刷新和上拉载入很多其它

需求 先上效果图, Material Design风格的下拉刷新和上拉载入很多其它. 源代码地址(欢迎star) https://github.com/studychen/SeeNewsV2 假设对于RecyclerView还不熟悉,參见这篇 Android Material Design学习之RecyclerView取代 ListView 本文链接 http://blog.csdn.net/never_cxb/article/details/50759109 转载请注明出处 下拉刷新 效果图