写在前面
1,布局用到的控件:
<com.handmark.pulltorefresh.library.PullToRefreshListView" />
需要导外部包插件 pulltorefresh_library
JsonBena类就不说了
用到的权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
一、创建一个抽屉类
public abstract class BaseActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(bindLayout());
initView();//找控件
initData();//给控件设置数据(位置不要写反了!!!)
bindEvent();
}
public abstract int bindLayout();//绑定布局的方法
public abstract void initView();//绑定组件
public abstract void initData();//绑定数据的方法 (请求网络
public abstract void bindEvent();//设置监听的方法
protected <T extends View> T bindView(int resid){
return findViewById(resid);
}
}
二、在MainActivity继承抽屉类 重写需要的方法
public class MainActivity extends BaseActivity {
private PullToRefreshListView listview;
private MyHelper helper;
private SQLiteDatabase db;
private MyAdapter adapter;
private List<JsonBean> list;
private String string = "https://www.apiopen.top/novelApi";
@Override
public int bindLayout() {
//找布局
return R.layout.activity_main;
}
@Override
public void initView() {
//和XListview一样实现上拉加载下拉刷新的!但是XListview只能刷新listview,
// 而pulltorefresh可以刷新.....
//第一步:布局
//第二步:找控件
listview = bindView(R.id.pull);
//第三步:设置属性
// 设置刷新的模式:常用的有三种
// PullToRefreshBase.Mode.BOTH //上下拉刷新都可以
// PullToRefreshBase.Mode.PULL_FROM_START //只允许下拉刷新
// PullToRefreshBase.Mode.PULL_FROM_END //只允许上拉加载
listview.setMode(PullToRefreshBase.Mode.BOTH);
//第四步 是否允许刷新时滑动
listview.setScrollingWhileRefreshingEnabled(true);
//接下来和XListView一样
//如果有网就把数据存到数据库
helper = new MyHelper(MainActivity.this);
//获取数据库操作类
db = helper.getWritableDatabase();
}
@Override
public void initData() {
if (HttpUtils.isNeworkConnected(MainActivity.this)){
HttpUtils.httpAsynTask(string,new HttpUtils.CallBackString(){
@Override
public void getData(String s) {
Gson gson = new Gson();
TwoBean bean = gson.fromJson(s, TwoBean.class);
list = bean.getData();
adapter = new MyAdapter(MainActivity.this, list);
listview.setAdapter(adapter);
//先判断有没有数据
Cursor cursor = db.query("person", null, null, null, null, null, null);
//判断有没第一个数据,如果有就证明有数据
if (!cursor.moveToFirst()){
ContentValues values = new ContentValues();
values.put("Title",s);
db.insert("person",null,values);
}
}
});
}else{
//如果没网就请求数据库
Cursor cursor = db.query("person", null, null, null, null, null, null);
//如果有第一条数据就查询数据
if (cursor.moveToFirst()){
String s ="";
do{
s = cursor.getString(cursor.getColumnIndex("Title"));
}while (cursor.moveToNext());
Gson gson = new Gson();
TwoBean bean = gson.fromJson(s, TwoBean.class);
list = bean.getData();
adapter = new MyAdapter(MainActivity.this, list);
listview.setAdapter(adapter);
}else{
Toast.makeText(MainActivity.this, "没有数据,请打开网络", Toast.LENGTH_LONG).show();
}
cursor.close();
}
}
@Override
public void bindEvent() {
//第五步:设置监听 (这里注意要new OnRefreshListener2 不要错了,
// 如果只有一个方法就证明你new错了)
listview.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
//下拉刷新调用方法
if (HttpUtils.isNeworkConnected(MainActivity.this)){
HttpUtils.httpAsynTask(string, new HttpUtils.CallBackString() {
@Override
public void getData(String s) {
Gson gson = new Gson();
TwoBean bean = gson.fromJson(s, TwoBean.class);
list = bean.getData();
adapter = new MyAdapter(MainActivity.this, list);
listview.setAdapter(adapter);
listview.onRefreshComplete();
}
});
}else{
Toast.makeText(MainActivity.this, "世界上最远的距离不是天涯海角,是没有网络!", Toast.LENGTH_LONG).show();
listview.onRefreshComplete();
}
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
if (HttpUtils.isNeworkConnected(MainActivity.this)){
HttpUtils.httpAsynTask(string, new HttpUtils.CallBackString() {
@Override
public void getData(String s) {
Gson gson = new Gson();
TwoBean bean = gson.fromJson(s, TwoBean.class);
ArrayList<JsonBean> data = bean.getData();
adapter.notifyDataSetChanged();
listview.onRefreshComplete();
}
});
}else{
Toast.makeText(MainActivity.this, "世界上最远的距离不是天涯海角,是没有网络!", Toast.LENGTH_LONG).show();
listview.onRefreshComplete();
}
}
});
}
}
三、需要用到的工具类
public class HttpUtils {
//接口================================
public interface CallBackString{
void getData(String s);
}
public static void httpAsynTask(String strUrl, final CallBackString backString){
new AsyncTask<String,Integer,String>(){
@Override
protected String doInBackground(String... strings) {
return httpGet(strings[0]);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
backString.getData(s);
}
}.execute(strUrl);
}
public static String httpGet(String strUrl){
try {
URL url = new URL(strUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setReadTimeout(5000);
InputStream stream = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
StringBuilder builder = new StringBuilder();
String str = "";
while ((str = reader.readLine())!=null){
builder.append(str);
}
connection.disconnect();
return builder.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//判断网络
public static boolean isNeworkConnected(Context context){
if (context!=null){
//获取连接管理器
ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
//获取网络状态
NetworkInfo networkInfo = mConnectivityManager.getActiveNetworkInfo();
if (networkInfo!=null){
return networkInfo.isAvailable();
}
}
return false;
}
}
四、创建数据库
public class MyHelper extends SQLiteOpenHelper {
public MyHelper(Context context) {
super(context, "bw.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE person(id INTEGER PRIMARY KEY AUTOINCREMENT,Title TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
五、适配器
public class MyAdapter extends BaseAdapter {
private Context context;
private List<JsonBean> list;
public MyAdapter(Context context, List<JsonBean> list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = View.inflate(context,android.R.layout.simple_list_item_1,null);
TextView textView = convertView.findViewById(android.R.id.text1);
textView.setText(list.get(position).getAuthor_name());
return convertView;
}
}