Http請求解析json listview多條目展示加到資料庫
阿新 • • 發佈:2018-11-22
1.MainActivity主介面
package com.example.week01_01; import android.annotation.SuppressLint; import android.content.DialogInterface; import android.content.Intent; import android.os.AsyncTask; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.Toast; import java.util.ArrayList; import java.util.List; import static com.example.week01_01.LoginActivity.URL_KEY; public class MainActivity extends AppCompatActivity { private ListView listView; private NewsAdaper mAdaper; private NewDao dao; private List<NewsBean.Data> select; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //獲取資源id listView = findViewById(R.id.lv_list); //穿件介面卡 mAdaper = new NewsAdaper(MainActivity.this); listView.setAdapter(mAdaper); dao = new NewDao(MainActivity.this); //判斷網路是否可用 if(!NetUtil.hasNetWork(MainActivity.this)){ showHasNetWork(); return; } infoData(); } private String ttUrl = "http://result.eolinker.com/k2BaduF2a6caa275f395919a66ab1dfe4b584cc60685573?uri=tt"; private String gnUrl = "http://result.eolinker.com/k2BaduF2a6caa275f395919a66ab1dfe4b584cc60685573?uri=gn"; @SuppressLint("StaticFieldLeak") private void infoData() { new AsyncTask<String,Void,List<NewsBean.Data>>(){ @Override protected List<NewsBean.Data> doInBackground(String... strings) { List<NewsBean.Data> result = new ArrayList<>(); for (String url:strings) { NewsBean bean = NetUtil.getRequest(url, NewsBean.class); result.addAll(bean.getResult().getData()); } if(dao.select().size() == 0) { for (NewsBean.Data d : result) { String title = d.getTitle(); String date = d.getDate(); String category = d.getCategory(); dao.add(title, date,category); } } select = dao.select(); return select; } @Override protected void onPostExecute(List<NewsBean.Data> data) { mAdaper.setmData(data); } }.execute(ttUrl,gnUrl); } private void showHasNetWork() { new AlertDialog.Builder(MainActivity.this) .setTitle("無網路") .setMessage("當前無網路,是否去設定") .setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent("android.settings.WIRELESS_SETTINGS"); startActivity(intent); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }) .show(); } }
2.Bean類
package com.example.week01_01; import java.util.List; public class NewsBean { public Result result; public Result getResult() { return result; } public void setResult(Result result) { this.result = result; } public class Result{ public List<Data> data; public List<Data> getData() { return data; } public void setData(List<Data> data) { this.data = data; } } public static class Data{ public final String tt = "頭條"; public String title; public String date; public String category; public String thumbnail_pic_s; public String url; public Data(String title, String date, String category) { this.title = title; this.date = date; this.category = category; } public String getTt() { return tt; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } public String getThumbnail_pic_s() { return thumbnail_pic_s; } public void setThumbnail_pic_s(String thumbnail_pic_s) { this.thumbnail_pic_s = thumbnail_pic_s; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } //判斷當前條目是否是頭條 public boolean isTT(){ return category.equals(tt); } } }
3.介面卡
package com.example.week01_01; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import java.util.ArrayList; import java.util.List; public class NewsAdaper extends BaseAdapter { private List<NewsBean.Data> mData; private Context mContext; private final int ITEM_COUNT = 2; private final int TT_ITEM = 0; private final int GN_ITEM = 1; public NewsAdaper(Context mContext) { this.mContext = mContext; //初始化 mData = new ArrayList<>(); } public void setmData(List<NewsBean.Data> mData) { this.mData = mData; notifyDataSetChanged(); } @Override public int getItemViewType(int position) { return getItem(position).isTT() ? TT_ITEM : GN_ITEM; } @Override public int getViewTypeCount() { return ITEM_COUNT; } @Override public int getCount() { return mData.size(); } @Override public NewsBean.Data getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate( getItemViewType(position) == GN_ITEM ? R.layout.gn_item : R.layout.tt_item, parent, false); holder = new ViewHolder(convertView); }else{ holder = (ViewHolder) convertView.getTag(); } holder.bind(getItem(position)); return convertView; } class ViewHolder { ImageView image; TextView title; TextView date; public ViewHolder(View convertView) { title = convertView.findViewById(R.id.title); date = convertView.findViewById(R.id.date); image = convertView.findViewById(R.id.image); convertView.setTag(this); } public void bind(NewsBean.Data item) { title.setText(item.getTitle()); date.setText(item.getDate()); if(image!=null){ image.setImageResource(R.mipmap.ic_launcher); } } } }
4.sqliteHelper類
package com.example.week01_01;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
public class SqliteHelper extends SQLiteOpenHelper {
public SqliteHelper(@NonNull Context context) {
super(context, "New.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
//建立表
db.execSQL("create table news(id integer primary key autoincrement," +
"title text," +
"date text," +
"category text)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
5.dao類
package com.example.week01_01;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.util.ArrayList;
import java.util.List;
public class NewDao {
private final SqliteHelper helper;
private final SQLiteDatabase sb;
public NewDao(Context context){
//建立資料庫
helper = new SqliteHelper(context);
sb = helper.getReadableDatabase();
}
//新增
public void add(String title,String date,String category){
ContentValues values = new ContentValues();
values.put("title",title);
values.put("date",date);
values.put("category",category);
sb.insert("news",null,values);
}
//查詢
public List<NewsBean.Data> select(){
Cursor news = sb.query("news", null, null, null, null, null, null);
List<NewsBean.Data> list = new ArrayList<>();
while (news.moveToNext()){
String title = news.getString(news.getColumnIndex("title"));
String date = news.getString(news.getColumnIndex("date"));
String category = news.getString(news.getColumnIndex("category"));
NewsBean.Data data = new NewsBean.Data(title,date,category);
list.add(data);
}
return list;
}
}
6.工具類
package com.example.week01_01;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import com.google.gson.Gson;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class NetUtil {
//是否有可用網路
public static boolean hasNetWork(Context context){
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = cm.getActiveNetworkInfo();
return activeNetworkInfo!=null && activeNetworkInfo.isAvailable();
}
//執行get請求 返回string結果
public static String getRequest(String urlStr){
String request = "";
try {
//定義url地址
URL url = new URL(urlStr);
//開啟連線
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
//設定請求方式
urlConnection.setRequestMethod("GET");
//超時
urlConnection.setReadTimeout(5000);
urlConnection.setConnectTimeout(5000);
//獲取請求碼
int responseCode = urlConnection.getResponseCode();
if(responseCode == 200){
request = stream2String(urlConnection.getInputStream());
}
} catch (Exception e) {
e.printStackTrace();
}
return request;
}
//將位元組流轉換為字元流
private static String stream2String(InputStream inputStream) throws IOException {
InputStreamReader isr = new InputStreamReader(inputStream);
BufferedReader br = new BufferedReader(isr);
StringBuilder builder = new StringBuilder();
for(String tem = br.readLine();tem!=null;tem = br.readLine()){
builder.append(tem);
}
return builder.toString();
}
//執行get請求 返回Bean結果
public static <E> E getRequest(String urlStr,Class clazz){
String result = getRequest(urlStr);
E e = (E) new Gson().fromJson(result, clazz);
return e;
}
}