上一篇博客主要讲解对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"?>适配器的代码如下: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:id="@+id/swipeRefresh_canteen_second" android:layout_width="match_parent" android:layout_height="match_parent"> RecyclerView android:id="@+id/recyclerView_canteen_second" android:layout_width="match_parent" android:layout_height="match_parent" />
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"?>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"> android:id="@+id/img_xUrl" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="15dp" /> android:id="@+id/txtView_xName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/img_xUrl" android:paddingTop="10dp" /> 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" /> 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" />
对应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秒刷新了第三条小樱的数据。用户第四次刷新的时候就不再刷新数据,提醒用户已经没有可以刷新的数据了。效果如下图:
我的讲解到此为止,谢谢各位看客。