主页面布局,
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"

tools:context="com.example.database.MainActivity">


<com.handmark.pulltorefresh.library.PullToRefreshGridView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/pvg"
android:numColumns="3"
>

</com.handmark.pulltorefresh.library.PullToRefreshGridView>

</RelativeLayout>






主页面代码
package com.example.database;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import android.widget.GridView;
import android.widget.Toast;

import com.google.gson.Gson;
import com.handmark.pulltorefresh.library.ILoadingLayout;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshGridView;

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

import utils.MyTask;
import utils.NetStateUtil;

public class MainActivity extends AppCompatActivity {

//页数
private int pageIndex=1;
//操作类型
private int operType=1;
//请求的url地址
private String url="http://gank.io/api/data/Android/10/"+pageIndex;
//集合数据
private List<DataDataBean.ResultsBean> list=new ArrayList<>();
//适配器
private GridViewAdapter gridViewAdapter;
private PullToRefreshGridView pullToRefreshGridView;
private List<DataDataBean.ResultsBean> results=new ArrayList<>();
private DbcacheDao dbcacheDao;

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

pullToRefreshGridView = (PullToRefreshGridView) findViewById(R.id.pvg);

initPgv();

//构造出dao层
dbcacheDao = new DbcacheDao(this);

//1.判断有无网络
if(NetStateUtil.isConn(this)){
requestNetData();
}else {
Toast.makeText(this,"没有网络!",Toast.LENGTH_SHORT).show();

//无网,则提示用户并根据url先从数据库中查询数据,有数据则显示
//json字符串
String s = dbcacheDao.queryData(url);
//解析数据
if(!"".equals(s)){
Gson gson=new Gson();
DataDataBean dataDataBean = gson.fromJson(s, DataDataBean.class);
results.clear();
results.addAll(dataDataBean.getResults());
setAdapter();
}

}




}

//请求网络数据
private void requestNetData() {
MyTask task=new MyTask(new MyTask.Icallbacks() {
@Override
public void updateUiByjson(String jsonstr) {
//Toast.makeText(MainActivity.this,jsonstr,Toast.LENGTH_SHORT).show();
//缓存到数据库中
dbcacheDao.insertData(url,jsonstr);

Gson gson=new Gson();
DataDataBean dataDataBean = gson.fromJson(jsonstr, DataDataBean.class);
if(operType==1){//代表刷新操作
results.clear();//清空集合
}
results.addAll(dataDataBean.getResults());
setAdapter();

//关闭布局
pullToRefreshGridView.onRefreshComplete();
}
});
task.execute(url);



}

public void setAdapter(){
if(gridViewAdapter==null){
gridViewAdapter=new GridViewAdapter(this,results);
pullToRefreshGridView.setAdapter(gridViewAdapter);
}else{
gridViewAdapter.notifyDataSetChanged();

}
}

private void initPgv() {
//1.设置模式
pullToRefreshGridView.setMode(PullToRefreshBase.Mode.BOTH);
//2.设置布局
ILoadingLayout header = pullToRefreshGridView.getLoadingLayoutProxy(true, false);
header.setPullLabel("下拉刷新");
header.setRefreshingLabel("正在刷新");
header.setReleaseLabel("放开刷新");
ILoadingLayout footer = pullToRefreshGridView.getLoadingLayoutProxy(false, true);
footer.setPullLabel("上拉加载");
footer.setRefreshingLabel("正在加载");
footer.setReleaseLabel("放开加载");

//3.设置回调监听
pullToRefreshGridView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<GridView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<GridView> pullToRefreshBase) {
pageIndex=1;
url="http://gank.io/api/data/Android/10/"+pageIndex;
operType=1;
requestNetData();
}

@Override
public void onPullUpToRefresh(PullToRefreshBase<GridView> pullToRefreshBase) {
//加载更多
pageIndex++;
url="http://gank.io/api/data/Android/10/"+pageIndex;
//修改操作类型
operType=2;
requestNetData();


}
});



}


Dao包数据库
package com.example.database;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

/**
* Created by lenovo on 2017/12/14.
*/

class DbcacheDao {

private MyHelper helper;

public DbcacheDao(Context context) {
helper = new MyHelper(context);
}

//插入数据
public void insertData(String url,String jsonstr){
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("url",url);
values.put("json",jsonstr);
long rowid = db.insert("dbcache", null, values);

}
//根据传入的url地址查询json字符串
public String queryData(String url){
String json = "";
SQLiteDatabase db = helper.getWritableDatabase();
Cursor cursor = db.query("dbcache", null, "url=?", new String[]{url}, null, null,null);
while (cursor.moveToNext()){
json = cursor.getString(cursor.getColumnIndex("json"));
}
return json;
}
}


帮助类
package com.example.database;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
* Created by lenovo on 2017/12/14.
*/

class MyHelper extends SQLiteOpenHelper{
public MyHelper(Context context) {
super(context, "mydb", null , 1);
}

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {

sqLiteDatabase.execSQL("create table dbcache(id integer primary key autoincrement,url text not null,json text not null)");
}

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

}
}



适配器


import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.List;




/**
*
*/
public class GridViewAdapter extends BaseAdapter {
Context context;
List<DataDataBean.ResultsBean> list;

public GridViewAdapter(Context context, List<DataDataBean.ResultsBean> list) {
this.context = context;
this.list = list;
}

@Override
public int getCount() {
return list.size();
}

@Override
public Object getItem(int i) {
return list.get(i);
}

@Override
public long getItemId(int i) {
return i;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder holder;
if (view == null){
view = View.inflate(context, R.layout.item_gridviewlayout,null);
holder = new ViewHolder();

holder.textView = (TextView) view.findViewById(R.id.grid_text);

view.setTag(holder);

}else {
holder = (ViewHolder) view.getTag();
}

holder.textView.setText(list.get(i).getDesc());

//展示图片的时候,,,getImages这个集合有的有,有的为空...所以要进行.判断
// if (list.get(i).getImages() != null){
// //此时加载图片显示
// ImageLoader.getInstance().displayImage(list.get(i).getImages().get(0),holder.imageView, ImageLoaderUtil.getDefaultOption());
// }

return view;
}

private class ViewHolder{
TextView textView;
}}


适配器的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">


<TextView
android:id="@+id/grid_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="1"
android:ellipsize="end"/>

</LinearLayout>