下拉刷新——Android使用SwipeRefreshLayout简单实现下拉刷新与加载跟多

来源:互联网 发布:陆逊 知乎 编辑:程序博客网 时间:2024/05/19 19:15

首先我们看效果图

一、效果图

这里写图片描述

这里写图片描述

二、主布局

<?xml version="1.0" encoding="utf-8"?><android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@android:color/white"    android:orientation="vertical"   >    <include layout="@layout/toolbar" />    <android.support.v4.widget.SwipeRefreshLayout        android:id="@+id/SwipeRefreshLayout"        android:layout_width="match_parent"        android:layout_height="match_parent"        app:layout_behavior="@string/appbar_scrolling_view_behavior">        <android.support.v7.widget.RecyclerView            android:id="@+id/recyclerView"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:scrollbars="vertical"></android.support.v7.widget.RecyclerView>    </android.support.v4.widget.SwipeRefreshLayout></android.support.design.widget.CoordinatorLayout>

二、MainActivity

package com.leohan.refresh;import android.os.Bundle;import android.os.Handler;import android.support.v4.widget.SwipeRefreshLayout;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.Toolbar;import android.util.Log;import android.view.View;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import butterknife.ButterKnife;import butterknife.InjectView;public class MainActivity extends AppCompatActivity {    @InjectView(R.id.toolbar)    Toolbar toolbar;    @InjectView(R.id.recyclerView)    RecyclerView recyclerView;    @InjectView(R.id.SwipeRefreshLayout)    SwipeRefreshLayout swipeRefreshLayout;    boolean isLoading;    private List<Map<String, Object>> data = new ArrayList<>();    private RecyclerViewAdapter adapter = new RecyclerViewAdapter(this, data);    private Handler handler = new Handler();    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_notice);        ButterKnife.inject(this);        initView();        initData();    }    public void initView() {        setSupportActionBar(toolbar);        toolbar.setTitle(R.string.notice);        toolbar.setNavigationOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                finish();            }        });        swipeRefreshLayout.setColorSchemeResources(R.color.blueStatus);        swipeRefreshLayout.post(new Runnable() {            @Override            public void run() {                swipeRefreshLayout.setRefreshing(true);            }        });        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {            @Override            public void onRefresh() {                handler.postDelayed(new Runnable() {                    @Override                    public void run() {                        data.clear();                        getData();                    }                }, 2000);            }        });        final LinearLayoutManager layoutManager = new LinearLayoutManager(this);        recyclerView.setLayoutManager(layoutManager);        recyclerView.setAdapter(adapter);        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {            @Override            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {                super.onScrollStateChanged(recyclerView, newState);                Log.d("test", "StateChanged = " + newState);            }            @Override            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {                super.onScrolled(recyclerView, dx, dy);                Log.d("test", "onScrolled");                int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();                if (lastVisibleItemPosition + 1 == adapter.getItemCount()) {                    Log.d("test", "loading executed");                    boolean isRefreshing = swipeRefreshLayout.isRefreshing();                    if (isRefreshing) {                        adapter.notifyItemRemoved(adapter.getItemCount());                        return;                    }                    if (!isLoading) {                        isLoading = true;                        handler.postDelayed(new Runnable() {                            @Override                            public void run() {                                getData();                                Log.d("test", "load more completed");                                isLoading = false;                            }                        }, 1000);                    }                }            }        });        //添加点击事件        adapter.setOnItemClickListener(new RecyclerViewAdapter.OnItemClickListener() {            @Override            public void onItemClick(View view, int position) {                Log.d("test", "item position = " + position);            }            @Override            public void onItemLongClick(View view, int position) {            }        });    }    public void initData() {        handler.postDelayed(new Runnable() {            @Override            public void run() {                getData();            }        }, 1500);    }    /**     * 获取测试数据     */    private void getData() {        for (int i = 0; i < 6; i++) {            Map<String, Object> map = new HashMap<>();            data.add(map);        }        adapter.notifyDataSetChanged();        swipeRefreshLayout.setRefreshing(false);        adapter.notifyItemRemoved(adapter.getItemCount());    }}

三、RecyclerViewAdapter

package com.leohan.refresh;import android.content.Context;import android.support.v7.widget.RecyclerView.Adapter;import android.support.v7.widget.RecyclerView.ViewHolder;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import java.util.List;public class RecyclerViewAdapter extends Adapter<ViewHolder> {    private static final int TYPE_ITEM = 0;    private static final int TYPE_FOOTER = 1;    private Context context;    private List data;    public RecyclerViewAdapter(Context context, List data) {        this.context = context;        this.data = data;    }    public interface OnItemClickListener {        void onItemClick(View view, int position);        void onItemLongClick(View view, int position);    }    private OnItemClickListener onItemClickListener;    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {        this.onItemClickListener = onItemClickListener;    }    @Override    public int getItemCount() {        return data.size() == 0 ? 0 : data.size() + 1;    }    @Override    public int getItemViewType(int position) {        if (position + 1 == getItemCount()) {            return TYPE_FOOTER;        } else {            return TYPE_ITEM;        }    }    @Override    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        if (viewType == TYPE_ITEM) {            View view = LayoutInflater.from(context).inflate(R.layout.item_base, parent,                    false);            return new ItemViewHolder(view);        } else if (viewType == TYPE_FOOTER) {            View view = LayoutInflater.from(context).inflate(R.layout.item_foot, parent,                    false);            return new FootViewHolder(view);        }        return null;    }    @Override    public void onBindViewHolder(final ViewHolder holder, int position) {        if (holder instanceof ItemViewHolder) {            //holder.tv.setText(data.get(position));            if (onItemClickListener != null) {                holder.itemView.setOnClickListener(new View.OnClickListener() {                    @Override                    public void onClick(View v) {                        int position = holder.getLayoutPosition();                        onItemClickListener.onItemClick(holder.itemView, position);                    }                });                holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {                    @Override                    public boolean onLongClick(View v) {                        int position = holder.getLayoutPosition();                        onItemClickListener.onItemLongClick(holder.itemView, position);                        return false;                    }                });            }        }    }    static class ItemViewHolder extends ViewHolder {        TextView tv;        public ItemViewHolder(View view) {            super(view);            tv = (TextView) view.findViewById(R.id.tv_date);        }    }    static class FootViewHolder extends ViewHolder {        public FootViewHolder(View view) {            super(view);        }    }}

四、item_base

<?xml version="1.0" encoding="utf-8"?><android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:layout_marginLeft="@dimen/margin_10"    android:layout_marginRight="@dimen/margin_10"    android:layout_marginTop="6dp"    android:orientation="vertical"    app:cardBackgroundColor="@color/line"    app:cardPreventCornerOverlap="true"    app:cardUseCompatPadding="true"    app:contentPadding="6dp">    <LinearLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        android:orientation="vertical">        <TextView            android:id="@+id/tv_date"            style="@style/NormalTextView"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="2015-12-11 12:00" />        <android.support.v7.widget.CardView            android:layout_width="match_parent"            android:layout_height="match_parent"            android:orientation="vertical"            app:cardBackgroundColor="@color/white"            app:cardPreventCornerOverlap="true"            app:cardUseCompatPadding="true"            app:contentPadding="10dp">            <TextView                android:id="@+id/tv_title"                style="@style/SmallGreyTextView"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:ellipsize="end"                android:maxLines="2"                android:text="视线好转,0729出口开通,0621进口开通。视线好转,0729出口开通,0621进口开通。" />        </android.support.v7.widget.CardView>    </LinearLayout></android.support.v7.widget.CardView>

五、item_foot.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="40dp"    android:gravity="center"    android:orientation="horizontal" >    <ProgressBar        android:layout_marginRight="6dp"        android:id="@+id/progressBar"        style="?android:attr/progressBarStyleSmall"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center" />    <TextView        style="@style/SmallGreyTextView"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center"        android:text="@string/loading" /></LinearLayout>

六、toolbar.xml

<?xml version="1.0" encoding="utf-8"?><merge xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto">    <android.support.design.widget.AppBarLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:fitsSystemWindows="true">        <android.support.v7.widget.Toolbar            android:id="@+id/toolbar"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:background="@color/blueStatus"            android:minHeight="?attr/actionBarSize"            app:layout_scrollFlags="scroll|enterAlways"            app:navigationIcon="?attr/homeAsUpIndicator"            app:theme="@style/Theme.AppCompat.NoActionBar">        </android.support.v7.widget.Toolbar>    </android.support.design.widget.AppBarLayout></merge>

七、其他

颜色:

<?xml version="1.0" encoding="utf-8"?><resources>    <color name="colorPrimary">#3F51B5</color>    <color name="colorPrimaryDark">#303F9F</color>    <color name="colorAccent">#FF4081</color>    <color name="blueText">#1485C6</color>    <color name="blueIndexStatus">#67A5EF</color>    <color name="blueStatus">#1680E2</color>    <color name="white">#FFFFFFFF</color>    <color name="dark">#424242</color>    <color name="red">#FFD4212A</color>    <color name="grey">#8C8C8C</color>    <color name="line">#EEEEEE</color>    <color name="background">#F9F9FA</color>    <color name="greyBackground">#FFCFCFCF</color></resources>//尺寸:    <dimen name="activity_horizontal_margin">16dp</dimen>    <dimen name="activity_vertical_margin">16dp</dimen>    <dimen name="margin_10">10dp</dimen>    <dimen name="textSize_title">20sp</dimen>    <dimen name="textSize_normal">16sp</dimen>    <dimen name="textSize_small">14sp</dimen>//strings<resources>    <string name="app_name">RefreshDemo</string>    <string name="loading">加载中…</string>    <string name="notice">重要公告</string></resources>//styles<resources>    <!-- Base application theme. -->    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">        <!-- Customize your theme here. -->        <item name="colorPrimary">@color/blueStatus</item>        <item name="colorPrimaryDark">@color/blueStatus</item>        <item name="colorAccent">@color/colorAccent</item>        <item name="windowActionBar">false</item>        <item name="android:windowNoTitle">true</item>    </style>    <style name="AppBaseTheme" parent="Theme.AppCompat.Light.NoActionBar">        <item name="colorPrimary">@color/blueStatus</item>        <item name="colorPrimaryDark">@color/blueStatus</item>        <item name="colorAccent">@color/blueStatus</item>        <item name="windowActionBar">false</item>        <item name="android:windowNoTitle">true</item>    </style>    <!--TextView-->    <style name="NormalTextView">        <item name="android:textColor">@color/dark</item>        <item name="android:textSize">@dimen/textSize_normal</item>    </style>    <style name="NormalGreyTextView">        <item name="android:textColor">@color/grey</item>        <item name="android:textSize">@dimen/textSize_normal</item>    </style>    <style name="SmallTextView">        <item name="android:textColor">@color/dark</item>        <item name="android:textSize">@dimen/textSize_small</item>    </style>    <style name="SmallGreyTextView">        <item name="android:textColor">@color/grey</item>        <item name="android:textSize">@dimen/textSize_small</item>    </style></resources>