新闻案例网络版(listview实现)

来源:互联网 发布:吉诺比利巅峰数据 编辑:程序博客网 时间:2024/05/20 04:49

package com.itheima74.newsnet;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.os.SystemClock;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import com.itheima74.newsnet.dao.NewsDao;import com.itheima74.newsnet.domain.NewsBean;import com.itheima74.newsnet.utils.NewsUtil;import com.itheima74.newsnet.view.MyImageView;import java.util.ArrayList;/** * 1.使用tomcat作为本地服务器 * 2.访问服务器,获取json数据并解析 * 3.本地缓存到数据库 * 4.加载网络图片使用自定义控件 * 5.listview展示数据 */public class MainActivity extends AppCompatActivity {    private ListView lv;    private ArrayList<NewsBean> mLocalNewsList;    private MyAdapter mAdapter;    private static final int LOCAL_LIST_IS_OK = 1;    private static final int NET_LIST_IS_OK = 2;    private static final int NET_FAIL = 3;    private Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            switch (msg.what) {                case LOCAL_LIST_IS_OK:                    mAdapter = new MyAdapter();                    lv.setAdapter(mAdapter);                    break;                case NET_LIST_IS_OK:                    mAdapter.notifyDataSetChanged();                    break;                case NET_FAIL:                    Toast.makeText(MainActivity.this, "网络连接失败", Toast.LENGTH_SHORT).show();                    break;            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        initData();    }    private void initData() {        //1.先去本地数据库获取数据        getLocalData();        //2.再去网络请求数据        getNetData();    }    /**     * 网络获取新闻数据,子线程查询     */    private void getNetData() {        new Thread() {            @Override            public void run() {                // 睡眠5秒后去网络获取数据                SystemClock.sleep(5 * 1000);                ArrayList<NewsBean> netNewsList = NewsUtil.getNetNewsList(mLocalNewsList, getApplicationContext());                // 如果网络数据已更新,则需刷新界面                if (netNewsList.size() > mLocalNewsList.size()) {                    mLocalNewsList = netNewsList;                    // 刷新界面需要主线程进行                    Message message = Message.obtain();                    message.what = NET_LIST_IS_OK;                    mHandler.sendMessage(message);                } else if (netNewsList.size() == 0) {// 未获取网络数据,网络异常                    // 打印吐司需要在主线程运行                    Message message = Message.obtain();                    message.what = NET_FAIL;                    mHandler.sendMessage(message);                }            }        }.start();    }    /**     * 本地数据库获取新闻数据,子线程查询     */    private void getLocalData() {        new Thread() {            @Override            public void run() {                NewsDao newsDao = new NewsDao(getApplicationContext());                mLocalNewsList = newsDao.query();                Message message = Message.obtain();                message.what = LOCAL_LIST_IS_OK;                mHandler.sendMessage(message);            }        }.start();    }    private void initView() {        lv = (ListView) findViewById(R.id.lv);        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                Intent intent = new Intent();                intent.setAction(Intent.ACTION_VIEW);                intent.setData(Uri.parse(mLocalNewsList.get(position).news_url));                startActivity(intent);            }        });    }    private class MyAdapter extends BaseAdapter {        @Override        public int getCount() {            return mLocalNewsList.size();        }        @Override        public NewsBean getItem(int position) {            return mLocalNewsList.get(position);        }        @Override        public long getItemId(int position) {            return position;        }        @Override        public View getView(int position, View convertView, ViewGroup parent) {            if (convertView == null) {                convertView = View.inflate(getApplicationContext(), R.layout.listview_item, null);            }            // 初始化控件            TextView tv_title = (TextView) convertView.findViewById(R.id.tv_title);            TextView tv_des = (TextView) convertView.findViewById(R.id.tv_des);            TextView tv_comment = (TextView) convertView.findViewById(R.id.tv_comment);            TextView tv_type = (TextView) convertView.findViewById(R.id.tv_type);            // MyImageView是自定义可加载网络图片的控件            MyImageView myImageView = (MyImageView) convertView.findViewById(R.id.iv_icon);            // 更新内容            NewsBean newsBean = getItem(position);            tv_title.setText(newsBean.title);            tv_des.setText(newsBean.des);            tv_comment.setText("评论数:" + newsBean.commont);            switch (newsBean.type) {                case 1:                    tv_type.setText("科技");                    break;                case 2:                    tv_type.setText("时事");                    break;                case 3:                    tv_type.setText("头条");                    break;            }            // myImageView单独加载图片内容            myImageView.setIconUrl(newsBean.icon_url);            return convertView;        }    }}

package com.itheima74.newsnet.domain;/** * Created by My on 2017/2/12. */public class NewsBean {    public int _id;    public String title;    public String des;    public String news_url;    public String icon_url;    public String time;    public int type;    public int commont;    @Override    public String toString() {        return "NewsBean{" +                "_id=" + _id +                ", title='" + title + '\'' +                ", des='" + des + '\'' +                ", news_url='" + news_url + '\'' +                ", icon_url='" + icon_url + '\'' +                ", time='" + time + '\'' +                ", type=" + type +                ", commont=" + commont +                '}';    }}

package com.itheima74.newsnet.dao;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;/**MySqlitOpenHelp * Created by My on 2017/2/12. */class MySqlitOpenHelp extends SQLiteOpenHelper {    MySqlitOpenHelp(Context context) {        super(context, "heimanews", null, 1);    }    @Override    public void onCreate(SQLiteDatabase sqLiteDatabase) {        String sql = "create table news(_id integer primary key,title varchar(100),des varchar(100)," +                "news_url varchar(100),icon_url varchar(100),time varchar(100),type integer,comment integer)";        sqLiteDatabase.execSQL(sql);    }    @Override    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {    }}

package com.itheima74.newsnet.dao;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import com.itheima74.newsnet.domain.NewsBean;import java.util.ArrayList;/** * 数据库增删改查类 * Created by My on 2017/2/12. */public class NewsDao {    private MySqlitOpenHelp mSqlitOpenHelp;    public NewsDao(Context context) {        mSqlitOpenHelp = new MySqlitOpenHelp(context);    }    public void insert(ArrayList<NewsBean> netNewsList) {        SQLiteDatabase db = mSqlitOpenHelp.getReadableDatabase();        for (NewsBean newsBean:netNewsList) {            ContentValues values = new ContentValues();            values.put("_id",newsBean._id);            values.put("title",newsBean.title);            values.put("des",newsBean.des);            values.put("news_url",newsBean.news_url);            values.put("icon_url",newsBean.icon_url);            values.put("time",newsBean.time);            values.put("type",newsBean.type);            values.put("comment",newsBean.commont);            db.insert("news",null,values);        }        db.close();    }    /**     * 清空数据库所有数据的方法     */    public void delete() {        SQLiteDatabase db = mSqlitOpenHelp.getReadableDatabase();        db.delete("news", null, null);        db.close();    }    /**     * 查询数据库所有数据的方法,有多少查多少     *     * @return 数据库所有新闻数据集合     */    public ArrayList<NewsBean> query() {        ArrayList<NewsBean> allLocalList = new ArrayList<>();        SQLiteDatabase db = mSqlitOpenHelp.getReadableDatabase();        Cursor cursor = db.query("news", null, null, null, null, null, null);        if (cursor != null && cursor.getCount() > 0) {            while (cursor.moveToNext()) {                NewsBean newsBean = new NewsBean();                newsBean._id = cursor.getInt(0);                newsBean.title = cursor.getString(1);                newsBean.des = cursor.getString(2);                newsBean.news_url = cursor.getString(3);                newsBean.icon_url = cursor.getString(4);                newsBean.time = cursor.getString(5);                newsBean.type = cursor.getInt(6);                newsBean.commont = cursor.getInt(7);                allLocalList.add(newsBean);            }        }        db.close();        cursor.close();        return allLocalList;    }}

package com.itheima74.newsnet.utils;import android.content.Context;import com.itheima74.newsnet.dao.NewsDao;import com.itheima74.newsnet.domain.NewsBean;import org.json.JSONArray;import org.json.JSONObject;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.util.ArrayList;/** * 去网络获取所有新闻数据 * Created by My on 2017/2/12. */public class NewsUtil {    public static ArrayList<NewsBean> getNetNewsList(ArrayList<NewsBean> localList,Context context) {        ArrayList<NewsBean> netNewsList = new ArrayList<>();        String news_path = "http://10.0.2.2:8080/news.json";        try {            URL url = new URL(news_path);            HttpURLConnection conn = (HttpURLConnection) url.openConnection();            conn.setRequestMethod("GET");            conn.setConnectTimeout(1000 * 5);            int responseCode = conn.getResponseCode();            if (responseCode == 200) {                InputStream inputStream = conn.getInputStream();                String result = StreamUtil.stream2String(inputStream);                System.out.println("result:"+result);                // json数据解析                JSONObject jsonObject_root = new JSONObject(result);                JSONArray jsonArray = jsonObject_root.getJSONArray("newss");                for (int i = 0; i < jsonArray.length(); i++) {                    NewsBean newsBean = new NewsBean();                    JSONObject news = jsonArray.getJSONObject(i);                    newsBean._id = news.getInt("id");                    newsBean.time = news.getString("time");                    newsBean.des = news.getString("des");                    newsBean.title = news.getString("title");                    newsBean.news_url = news.getString("news_url");                    newsBean.icon_url = news.getString("icon_url");                    newsBean.commont = news.getInt("comment");                    newsBean.type = news.getInt("type");                    netNewsList.add(newsBean);                }            }        } catch (Exception e) {            e.printStackTrace();        }        // 获取到数据本地数据库保存一份,获取到新数据才保存        if (netNewsList.size() > localList.size()) {            NewsDao newsDao = new NewsDao(context);            newsDao.delete();            newsDao.insert(netNewsList);        }        return netNewsList;    }}

package com.itheima74.newsnet.utils;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;/** * stream2String * Created by My on 2017/2/12. */class StreamUtil {    static String stream2String(InputStream in) {        String result = null;        ByteArrayOutputStream baos = null;        try {            baos = new ByteArrayOutputStream();            byte[] buffer = new byte[1024];            int len;            while ((len = in.read(buffer)) != -1) {                baos.write(buffer, 0, len);            }            result = baos.toString();        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                in.close();                baos.close();            } catch (IOException e) {                e.printStackTrace();            }        }        return result;    }}

package com.itheima74.newsnet.view;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.widget.ImageView;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;/** * 自定义可加载网络图片的ImageView * Created by My on 2017/2/12. */public class MyImageView extends ImageView {    private Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            Bitmap bitmap = (Bitmap) msg.obj;            MyImageView.this.setImageBitmap(bitmap);        }    };    public MyImageView(Context context) {        super(context);    }    public MyImageView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public MyImageView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    /**     * @param path 图片url     */    public void setIconUrl(final String path) {        new Thread() {            @Override            public void run() {                try {                    URL url = new URL(path);                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();                    conn.setRequestMethod("GET");                    conn.setConnectTimeout(1000 * 5);                    int responseCode = conn.getResponseCode();                    if (responseCode == 200) {                        InputStream inputStream = conn.getInputStream();                        Bitmap bitmap = BitmapFactory.decodeStream(inputStream);                        Message message = Message.obtain();                        message.obj = bitmap;                        mHandler.sendMessage(message);                    }                } catch (Exception e) {                    e.printStackTrace();                }            }        }.start();    }}


0 0
原创粉丝点击