1、给WordPress安装WP REST API
使用WP REST API 可以用JSON数据与WordPress通信。
云引擎不支持线上安装插件,要把SVN仓库用“乌龟”CheckOut到本地,把下载好的WP REST API插件放在wp-content/plugin/下,再上传到线上,更新版本,打开仪表盘,启用插件。
需要用到的API是GET wp-json/wp/v2/posts,Arguments:
- per_page:每页显示数量,默认10;
- page:第几页,默认1;
2、引用XListView开源框架
在GitHub下载XListView开源框架,用AndroidStudio导入(important),把XListView、XListViewFooter、XListViewHeader三个文件及其他所需资源复制到包中,Rebuild。
需要重写的两个方法:
- onRefresh():下拉刷新
- onLoadMore():上拉加载
3、写两个Fragment
一个用于显示标题列表,叫PostsListFragment;
一个用于显示详细内容,叫ContentFragment;
需要注意的是:
- PostsListFragment要用动态加载的方法添加,不然ContentFragment会add不进来;
getFragmentManager().beginTransaction()
.add(R.id.container, new PostsListFragment(), "PostsListFragment")
.commit();
- 要为Fragment设置背景颜色,不然会出现界面重叠;
- 因为要带参数地创建ContentFragment,最好用.newInstance()方法。此方法在ContentFragment中重写。
ContentFragment fragment = ContentFragment.newInstance(title, content);
public static ContentFragment newInstance(String title,String content) {
Bundle args = new Bundle();
ContentFragment fragment = new ContentFragment();
args.putString("title",title);
args.putString("content",content);
fragment.setArguments(args);
return fragment;
}
4、 设置后退键效果
默认情况下,按后退键会直接退出Activity。
需要在MainActivity中重写onBackPress()方法:
public void onBackPressed() {
if (getFragmentManager().findFragmentByTag("ContentFragment") != null){
if (getFragmentManager().findFragmentByTag("ContentFragment").isAdded()){
getFragmentManager().popBackStack();
return;
}
}
super.onBackPressed();
}
5、判断网络连接状态
在创建网络连接前,要检查网络是否可用。
private boolean detect() {
ConnectivityManager connectivityManager = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkinfo = connectivityManager.getActiveNetworkInfo();
return !(networkinfo == null || !networkinfo.isAvailable());
}
并添加权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
6、下载数据
在异步任务中建立Http连接,发送GET请求到URI,即可获得字节输入流。
Gson解析需要两个参数:
- InputStreamReader 由InputStream包装而来。
- Type 由TypeToken<类型类>(){}.getType得到。类型类是描述得到的JSON数据的格式的类。
然后把Gson解析得到的列表存入数据库。需要写一个MySQLiteOpenHelper继承自SQLiteOpenHelper,重写onCreate()方法。
private String createTable = "create table WordPressPosts(" +//表名
"id INTEGER PRIMARY KEY AUTOINCREMENT," +//第一列,id,主键自增
"title VARCHAR," +//第二列,title
"content VARCHAR," +//第三列,content
"date VARCHAR)";//第四列,date
public void onCreate(SQLiteDatabase db) {
db.execSQL(createTable);
}
//下载第i页的数据
private void httpGetWp(String i) {
String wpPath = "http://learnandroid.cn-hangzhou.aliapp.com/wp-json/wp/v2/posts?page=" + i;
new AsyncTask<String, Void, Void>() {
@Override
protected Void doInBackground(String... params) {
System.out.println("开始下载数据");
InputStream is;
InputStreamReader isr;
ArrayList<JsonBean> listJsonBean;
try {
URL url = new URL(params[0]);
is = url.openStream();
isr = new InputStreamReader(is, "UTF-8");
//解析JSON字符流
Gson gson = new Gson();
Type type = new TypeToken<ArrayList<JsonBean>>() {
}.getType();
listJsonBean = gson.fromJson(isr, type);
//把listJsonBean存入数据库
MySQLiteOpenHelper helper = new MySQLiteOpenHelper(getActivity(), "data.db3", null, 1);
SQLiteDatabase db = helper.getWritableDatabase();
for (int j = 0; j < listJsonBean.size(); j++) {
System.out.println("存入了"+(j+1)+"条数据");
ContentValues cv = new ContentValues();
cv.put("title", listJsonBean.get(j).getTitle().getRendered());
cv.put("content", listJsonBean.get(j).getContent().getRendered());
cv.put("date", listJsonBean.get(j).getDate());
db.insert("WordPressPosts", null, cv);
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
7、读取本地数据库
数据库建立好后,会在/data/data/DataBase/目录下建立数据库文件。不要用HardCode方式写这个路径,要使用
getActivity().getDatabasePath("data.db3").getPath()
调用query()方法查询数据库,建立ArrayList,建立SimpleAdapter,更新UI界面:
//读取数据库,更新UI
private void readFile() {
System.out.println("开始读取本地数据库");
new AsyncTask<Void, Void, ArrayList<HashMap<String, String>>>() {
ArrayList<HashMap<String, String>> list = new ArrayList<>();
@Override
protected ArrayList<HashMap<String, String>> doInBackground(Void... params) {
MySQLiteOpenHelper helper = new MySQLiteOpenHelper(getActivity(), "data.db3", null, 1);
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.query("WordPressPosts", null, null, null, null, null, null);
System.out.println("数据库共有"+cursor.getCount()+"条数据");
while (cursor.moveToNext()) {
HashMap<String, String> map = new HashMap<>();
map.put("title", cursor.getString(cursor.getColumnIndex("title")));
map.put("content", cursor.getString(cursor.getColumnIndex("content")));
map.put("date", cursor.getString(cursor.getColumnIndex("date")));
list.add(map);
}
cursor.close();
return list;
}
@Override
protected void onPostExecute(ArrayList<HashMap<String, String>> hashMaps) {
super.onPostExecute(hashMaps);
arrayList = new ArrayList<>(hashMaps);
adapter = new SimpleAdapter(getActivity(), hashMaps, R.layout.list_item,
new String[]{"title", "date"}, new int[]{R.id.list_item_title, R.id.list_item_date});
lv.setAdapter(adapter);
}
}.execute();
}