android RecyclerView+SwipeRefreshLayout

上一篇博客主要讲解对listView的理解,然而安卓已经引入了RecyclerView控件,这篇博客主要讲解下RecyclerView的使用,以及引入了安卓自带的SwipeRefreshLayout进行下拉刷新。首先思路和上一篇博客一样, 在application 中通过sql脚本把数据写人到sd卡。具体如何把数据写人到sd卡,可以参考我的上一篇博客。下面主要对主界面进行讲解。废话不多说,首先贴出主界面代码:

package com.example.wmk.activity.canteenActivity;

import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.KeyEvent;
import android.widget.Toast;

import com.example.wmk.R;
import com.example.wmk.activity.MainActivity;
import com.example.wmk.activity.baseActivity.BaseActivity;
import com.example.wmk.adapter.XPAdapter;
import com.example.wmk.bean.XPBean;
import com.example.wmk.connector.OnClickDialogItemListener;
import com.example.wmk.db.DBUtils;
import com.example.wmk.utils.DialogUtils;
import com.example.wmk.utils.IntentUtils;
import com.lidroid.xutils.exception.DbException;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

import static com.example.wmk.constant.Constant.F0;

/**
 * 二食堂(RecyclerView的使用)
 */
public class CanteenSecondActivity extends BaseActivity implements SwipeRefreshLayout.OnRefreshListener {

    @BindView(R.id.swipeRefresh_canteen_second)
    SwipeRefreshLayout swipeRefreshCanteenSecond;
    @BindView(R.id.recyclerView_canteen_second)
    RecyclerView recyclerViewCanteenSecond;

    /**
     * 适配器
     */
    private XPAdapter adapter;
    private List<XPBean> lstXPBean;
    /**
     * 刷新索引
     */
    private int index = 0;

    private boolean isRefresh = true;

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
        }
    };

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

        ButterKnife.bind(this);

        try {
            lstXPBean = DBUtils.getInstance(this).findAll(XPBean.class);
        } catch (DbException e) {
            e.printStackTrace();
        }

        initSwipeRefreshLayout();

        initRecyclerView();
    }

    /**
     * 初始化SwipeRefreshLayout
     */
    private void initSwipeRefreshLayout() {
        //改变加载显示的颜色
        swipeRefreshCanteenSecond.setColorSchemeColors(Color.RED, Color.RED);
        //设置背景颜色
        swipeRefreshCanteenSecond.setBackgroundColor(Color.YELLOW);
        //设置初始时的大小
        swipeRefreshCanteenSecond.setSize(SwipeRefreshLayout.LARGE);
        //设置监听
        swipeRefreshCanteenSecond.setOnRefreshListener(this);
        //设置向下拉多少出现刷新
        swipeRefreshCanteenSecond.setDistanceToTriggerSync(100);
        //设置刷新出现的位置
        swipeRefreshCanteenSecond.setProgressViewEndTarget(false, 200);
    }

    /**
     * 初始化RecyclerView
     */
    private void initRecyclerView() {
        // 设置Item动画
        recyclerViewCanteenSecond.setItemAnimator(new DefaultItemAnimator());
        // 设置RecyclerView布局管理器
        recyclerViewCanteenSecond.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));

        // 初始化数据适配器
        adapter = new XPAdapter(this);

        // 刷新列表
        notifyDataSetChanged(lstXPBean);

        // 设置数据适配器
        recyclerViewCanteenSecond.setAdapter(adapter);

        //设置默认分割线
        recyclerViewCanteenSecond.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
    }

    /**
     * 刷新列表
     */
    public void notifyDataSetChanged(List<XPBean> datas) {
        adapter.clear();
        adapter.setDatas(datas);
        adapter.notifyDataSetChanged();
    }

    @Override
    public void onRefresh() {

        if (index == 0) {
            lstXPBean.add(new XPBean("鸣人", "assets://image/hy01.ico", "兰州拉面", "tel:110"));
        } else if (index == 1) {
            lstXPBean.add(new XPBean("佐助", "assets://image/hy02.ico", "东吴面馆", "tel:119"));
        } else if (index == 2) {
            lstXPBean.add(new XPBean("小樱", "assets://image/hy03.ico", "西北拉面", "tel:120"));
        } else {
            isRefresh = false;
            Toast.makeText(this, "没有更多的数据", Toast.LENGTH_SHORT).show();
            //停止刷新
            swipeRefreshCanteenSecond.setRefreshing(false);
        }

        if (isRefresh) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                // 刷新列表
                                notifyDataSetChanged(lstXPBean);
                                //停止刷新
                                swipeRefreshCanteenSecond.setRefreshing(false);

                                index++;
                            }
                        });
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                DialogUtils.dialogCommon(this, getStr(R.string.quit), new OnClickDialogItemListener() {
                    @Override
                    public void onClick(int flag) {
                        switch (flag) {
                            case F0:
                                IntentUtils.intent(CanteenSecondActivity.this, MainActivity.class, true);
                                break;
                        }
                    }
                });
                break;
        }
        return super.onKeyDown(keyCode, event);
    }
}
要使用recyclerview,需要配置信息(compile 'com.android.support:recyclerview-v7:25.1.0')如下所示:

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"

    defaultConfig {
        applicationId "com.example.wmk"
        minSdkVersion 21
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        debug {
            minifyEnabled false
            shrinkResources false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets {
        main {
            jniLibs.srcDirs = ['src/main/libs']
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile files('src/main/libs/xUtils-2.6.14.jar')
    compile files('src/main/java/v4/support-v4-21.0.0-sources.jar')
    compile 'com.android.support:appcompat-v7:25.1.0'
    compile 'com.android.support:support-v4:25.1.0'
    compile 'com.google.android.gms:play-services-appindexing:8.1.0'
    compile 'com.jakewharton:butterknife:8.1.0'
    apt 'com.jakewharton:butterknife-compiler:8.1.0'
    compile files('src/main/libs/universal-image-loader-1.9.4.jar')
    compile 'com.android.support:recyclerview-v7:25.1.0'
}
主界面activity_canteen_second.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="match_parent"
    android:orientation="vertical"
    tools:context="com.example.wmk.activity.canteenActivity.CanteenSecondActivity">

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swipeRefresh_canteen_second"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

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

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

</LinearLayout>
适配器的代码如下:

package com.example.wmk.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.wmk.R;
import com.example.wmk.bean.XPBean;
import com.nostra13.universalimageloader.core.ImageLoader;

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

/**
 * Created by 老王 on 2017/1/16.
 */

public class XPAdapter extends RecyclerView.Adapter<XPViewHolder> {

    private Context context;
    private List<XPBean> datas=new ArrayList<XPBean>();

    public XPAdapter(Context context) {
        this.context = context;
    }

    /**
     * Clear
     */
    public void clear() {
        this.datas.clear();
    }


    /**
     * Set Datas
     *
     * @param datas
     *            Datas
     */
    public void setDatas(List<XPBean> datas) {
        this.datas.addAll(datas);
    }

    @Override
    public XPViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.x_one_piece, parent, false);
        XPViewHolder viewHolder = new XPViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(XPViewHolder holder, int position) {
        XPBean item = datas.get(position);

        holder.txtViewXName.setText(item.getName());
        ImageLoader.getInstance().displayImage(item.getImgUrl(), holder.imgXUrl);
        holder.txtViewXDetail.setText(item.getDetail());
        holder.txtViewXReward.setText(item.getReward());
    }

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

class XPViewHolder extends RecyclerView.ViewHolder {

    TextView txtViewXName = null;
    ImageView imgXUrl = null;
    TextView txtViewXDetail = null;
    TextView txtViewXReward = null;


    public XPViewHolder(View itemView) {
        super(itemView);
        txtViewXName = (TextView) itemView.findViewById(R.id.txtView_xName);
        imgXUrl = (ImageView) itemView.findViewById(R.id.img_xUrl);
        txtViewXDetail = (TextView) itemView.findViewById(R.id.txtView_xDetail);
        txtViewXReward = (TextView) itemView.findViewById(R.id.txtView_xReward);
    }
}
x_one_piece.xml的布局代码如下:

<?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="wrap_content"
    android:background="@drawable/touch_bg"
    android:clickable="true">

    <ImageView
        android:id="@+id/img_xUrl"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="15dp" />

    <TextView
        android:id="@+id/txtView_xName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/img_xUrl"
        android:paddingTop="10dp" />

    <TextView
        android:id="@+id/txtView_xDetail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@id/img_xUrl"
        android:layout_toRightOf="@id/img_xUrl"
        android:paddingBottom="10dp" />

    <TextView
        android:id="@+id/txtView_xReward"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:paddingRight="5dp"
        android:paddingTop="25dp"
        android:textSize="15dp" />

</RelativeLayout>

 对应bean部分的代码如下:

package com.example.wmk.bean;

import android.os.Parcel;
import android.os.Parcelable;

import com.example.wmk.bean.base.BaseBean;
import com.lidroid.xutils.db.annotation.Column;
import com.lidroid.xutils.db.annotation.Table;

/**
 * Created by 老王 on 2017/1/12.
 */
@Table(name = "wmk_xOnePieceBean")
public class XPBean extends BaseBean implements Parcelable {

    @Column(column = "name")
    private String name;
    @Column(column = "imgUrl")
    private String imgUrl;
    @Column(column = "detail")
    private String detail;
    @Column(column = "reward")
    private String reward;

    public XPBean() {

    }

    /**
     * @param name   姓名
     * @param imgUrl 图片url
     * @param detail 详细描述
     * @param reward 赏金
     */
    public XPBean(String name, String imgUrl, String detail, String reward) {
        this.name = name;
        this.imgUrl = imgUrl;
        this.detail = detail;
        this.reward = reward;
    }

    protected XPBean(Parcel in) {
        name = in.readString();
        imgUrl = in.readString();
        detail = in.readString();
        reward = in.readString();
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(imgUrl);
        dest.writeString(detail);
        dest.writeString(reward);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    public static final Creator<XPBean> CREATOR = new Creator<XPBean>() {
        @Override
        public XPBean createFromParcel(Parcel in) {
            return new XPBean(in);
        }

        @Override
        public XPBean[] newArray(int size) {
            return new XPBean[size];
        }
    };

    public String getName() {
        return name;
    }

    public String getImgUrl() {
        return imgUrl;
    }

    public String getDetail() {
        return detail;
    }

    public String getReward() {
        return reward;
    }
}

对应baseBean的代码如下:

package com.example.wmk.bean.base;

import android.os.Parcel;
import android.os.Parcelable;

import com.lidroid.xutils.db.annotation.Id;

/**
 * Created by 老王 on 2017/1/17.
 */
public class BaseBean implements Parcelable {

    @Id(column = "id")
    private int id = 0;

    public BaseBean() {

    }

    public BaseBean(Parcel in) {
        id = in.readInt();
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int i) {
        dest.writeInt(id);
    }

    public static final Creator<BaseBean> CREATOR = new Creator<BaseBean>() {
        @Override
        public BaseBean createFromParcel(Parcel in) {
            return new BaseBean(in);
        }

        @Override
        public BaseBean[] newArray(int size) {
            return new BaseBean[size];
        }
    };
}
  baseBean可以存放一些公有的信息,比如用户名,账号,id等等,这个根据用户具体的需求提取。

  这样就实现了,用户第一次下拉的时候,经过2秒刷新了第一条鸣人的数据。第二次下拉的时候,经过2秒刷新了第二条佐助的数据。第三次下拉的时候,经过2秒刷新了第三条小樱的数据。用户第四次刷新的时候就不再刷新数据,提醒用户已经没有可以刷新的数据了。效果如下图:

  我的讲解到此为止,谢谢各位看客。



猜你喜欢

转载自blog.csdn.net/qq_21200053/article/details/54582137