1. 程式人生 > >Http請求解析json listview多條目展示加到資料庫

Http請求解析json listview多條目展示加到資料庫

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;
    }
}