Android实现监测网络变化以及无网络listview填充 简易新闻(十六 下)

本文介绍如何在Android应用中实现无网络状态下的新闻列表显示,包括修改布局文件以适应不同网络状态,以及使用数据库存储新闻数据以供离线查看。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android实现监测网络变化以及无网络listview填充 简易新闻(十六 下)

关于

本篇讲解在无网络后的数据填充(无网络提示),以及无网络打开app的展示以及网络有无的切换。
效果如下:
在这里插入图片描述

实现步骤

第一步,修改list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/swipe_refresh"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <ListView
                android:id="@+id/listView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:divider="@color/colorWhite"
                android:scrollbars="none">

            </ListView>

        </android.support.v4.widget.SwipeRefreshLayout>
        //这里添加无网络后显示的布局
        <LinearLayout
            android:id="@+id/NotNetWork_layout_empty"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:layout_gravity="center_vertical|center_horizontal"
            android:background="@color/colorhuise"
            android:orientation="vertical"
           >
            //图片放你自己喜欢的哦
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/netdis"
                />
            <TextView
                android:layout_marginTop="10dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="内容加载失败,请检查网络"
                android:textColor="#1C83EF"
                android:textSize="14sp" />
        </LinearLayout>

        <android.support.design.widget.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            android:layout_margin="16dp"
            android:src="@drawable/ic_vertical_align_top"
            app:elevation="8dp" />
    </FrameLayout>
</android.support.design.widget.CoordinatorLayout>

第二步,修改NewsFragment.java

package com.example.frametest;

import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;
import com.example.frametest.json.NewsBean;
import com.example.frametest.TabAdapter.MyTabAdapter;
import com.example.frametest.tools.DBOpenHelper;
import com.example.frametest.tools.MyApplication;
import com.example.frametest.tools.NetworkStateUtil;
import com.google.gson.Gson;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

import static interfaces.heweather.com.interfacesmodule.view.HeContext.context;

public class NewsFragment extends Fragment {
    private FloatingActionButton fab;
    private ListView listView;
    private SwipeRefreshLayout swipeRefreshLayout;
    private List<NewsBean.ResultBean.DataBean> list;
    private static final int UPNEWS_INSERT = 0;
    private int page =0,row =10;
    private static final int SELECT_REFLSH = 1;
    private static final int NO_NETWORK = 1001;
    String  responseDate; 
    String dataChina ="头条" ;
    @SuppressLint("HandlerLeak")
    private Handler newsHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            String uniquekey,title,date, category,author_name,url,thumbnail_pic_s,thumbnail_pic_s02,thumbnail_pic_s03;
            switch (msg.what){
                case UPNEWS_INSERT:
                    list = ((NewsBean) msg.obj).getResult().getData();
                    MyTabAdapter adapter = new MyTabAdapter(getActivity(),list);
                    listView.setAdapter(adapter);
                    adapter.notifyDataSetChanged();
                    break;
                case SELECT_REFLSH:
                    list =((NewsBean) msg.obj).getResult().getData();
                    MyTabAdapter myTabAdapter = new MyTabAdapter(getActivity(),list);
                    listView.setAdapter(myTabAdapter);
                    myTabAdapter.notifyDataSetChanged();
                    if (swipeRefreshLayout.isRefreshing()){
                        swipeRefreshLayout.setRefreshing(false);//设置不刷新
                        DialogUtil.closeDialog(mDialog);
                    }
                    break;
                case NO_NETWORK:
                //无网络下的listview的填充布局
                    list = new ArrayList<>();
                    MyTabAdapter myTabAdapter_Empty = new MyTabAdapter(getActivity(),list);
                    listView.setAdapter(myTabAdapter_Empty);
                    linearLayout_empty.setVisibility(View.VISIBLE);
                    listView.setEmptyView(linearLayout_empty);
                    if (swipeRefreshLayout.isRefreshing()){
                        swipeRefreshLayout.setRefreshing(false);//设置不刷新
                    }           
                    break;
                    default:
            }
        }
    };
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }
    LinearLayout linearLayout_empty;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.list_item,container,false);
        listView = (ListView) view.findViewById(R.id.listView);
        fab = (FloatingActionButton) view.findViewById(R.id.fab);
        swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_refresh);         
      linearLayout_empty = view.findViewById(R.id.NotNetWork_layout_empty);
      //无网络下再显示,平时隐藏
      linearLayout_empty.setVisibility(View.GONE);
        return view;
    }
    @SuppressLint("HandlerLeak")
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        onAttach(getActivity());
        //获取传递的值
        Bundle bundle = getArguments();
        final String data = bundle.getString("name","top");
        //置顶功能
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listView.smoothScrollToPosition(0);
            }
        });
        //下拉刷新
        swipeRefreshLayout.setColorSchemeResources(R.color.colorRed);
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
            //刷新功能需要网络,所以要判断是否有网络
                if (NetworkStateUtil.isNetDisconnected(MyApplication.getContext())){
                    Message Nomessage = Message.obtain();
                    Nomessage.what =NO_NETWORK;
                    newsHandler.sendMessage(Nomessage);                
                } else {
                    page++;
                    if (data.equals("guoji")){
                        dataChina ="国际";
                    }else if (data.equals("tiyu")){
                        dataChina ="体育";
                    }else if (data.equals("yule")){
                        dataChina ="娱乐";
                    }else if (data.equals("caijing")){
                        dataChina ="财经";
                    }else if (data.equals("keji")){
                        dataChina ="科技";
                    }else if (data.equals("guonei")){
                        dataChina ="国内";
                    }else if (data.equals("shehui")){
                        dataChina ="社会";
                    }else if (data.equals("junshi")){
                        dataChina ="军事";
                    }
                    // 下一步实现从数据库中读取数据刷新到listview适配器中
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            NewsBean newsBean = new NewsBean();
                            List<NewsBean.ResultBean.DataBean> dataBeanList = new ArrayList<>();
                            Connection conn = null;
                            conn = (Connection) DBOpenHelper.getConn();
                            int pages = (page -1)*row;
                            String sql = "select *from news_info where category='"+dataChina+"' limit "+pages+","+row;
                            PreparedStatement pst;
                            try {
                                pst = (PreparedStatement) conn.prepareStatement(sql);
                                ResultSet rs = pst.executeQuery();
                                while (rs.next()){
                                    NewsBean.ResultBean.DataBean dataBean = new NewsBean.ResultBean.DataBean();
                                    dataBean.setUniquekey(rs.getString(1));
                                    dataBean.setTitle(rs.getString(2));
                                    dataBean.setDate(rs.getString(3));
                                    dataBean.setCategory(rs.getString(4));
                                    dataBean.setAuthor_name(rs.getString(5));
                                    dataBean.setUrl(rs.getString(6));
                                    dataBean.setThumbnail_pic_s(rs.getString(7));
                                    dataBean.setThumbnail_pic_s02(rs.getString(8));
                                    dataBean.setThumbnail_pic_s03(rs.getString(9));
                                    dataBeanList.add(dataBean);
                                }
                                newsBean.setResult(new NewsBean.ResultBean());
                                newsBean.getResult().setData(dataBeanList);
                                pst.close();
                                conn.close();
                            } catch (SQLException e) {
                                e.printStackTrace();
                            }
                            Message msg = newsHandler.obtainMessage();
                            msg.what = SELECT_REFLSH;
                            msg.obj = newsBean;
                            newsHandler.sendMessage(msg);
                        }
                    }).start();         
                }
                    }
        });
        //异步加载数据
        getDataFromNet(data);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //获取点击条目的路径,传值显示webview页面
                String url = list.get(position).getUrl();
                String uniquekey = list.get(position).getUniquekey();
            //    final NewsBean.ResultBean.DataBean dataBean = (NewsBean.ResultBean.DataBean) list.get(position);
                //这里是在listview子item的点击事件中添加一个插入新闻的具体json数据到news_info表中
               /* new Thread(new Runnable() {
                    @Override
                    public void run() {
                        Connection conn = null;
                        conn = (Connection) DBOpenHelper.getConn();
                        System.out.print(conn);
                        String sql = "insert into news_info(uniquekey,title,date,category,author_name,url,thumbnail_pic_s,thumbnail_pic_s02,thumbnail_pic_s03) values(?,?,?,?,?,?,?,?,?)";
                        int i = 0;
                        PreparedStatement pstmt;
                        try {
                            pstmt = (PreparedStatement) conn.prepareStatement(sql);
                            pstmt.setString(1,dataBean.getUniquekey());
                            pstmt.setString(2,dataBean.getTitle());
                            pstmt.setString(3,dataBean.getDate());
                            pstmt.setString(4,dataBean.getCategory());
                            pstmt.setString(5,dataBean.getAuthor_name());
                            pstmt.setString(6,dataBean.getUrl());
                            pstmt.setString(7,dataBean.getThumbnail_pic_s());
                            pstmt.setString(8,dataBean.getThumbnail_pic_s02());
                            pstmt.setString(9,dataBean.getThumbnail_pic_s03());
                            i = pstmt.executeUpdate();
                            pstmt.close();
                            conn.close();
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();*/
                Intent intent = new Intent(getActivity(),WebActivity.class);
                intent.putExtra("url",url);
                intent.putExtra("uniquekey",uniquekey);
                startActivity(intent);

            }
        });
    }
    private void getDataFromNet(final String data){
        final String path = "http://v.juhe.cn/toutiao/index?type="+data+"&key=547ee75ef186fc55a8f015e38dcfdb9a";
        if (NetworkStateUtil.isNetDisconnected(MyApplication.getContext())){
            Message mNomessage = Message.obtain();
            mNomessage.what = NO_NETWORK;
            newsHandler.sendMessage(mNomessage);
         
        }else {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    OkHttpClient okHttpClient = new OkHttpClient();
                    Request request = new Request.Builder()
                            .url(path)
                            .build();

                    try {
                        Response response = okHttpClient.newCall(request).execute();
                        responseDate = response.body().string();
                        NewsBean newsBean = new Gson().fromJson(responseDate, NewsBean.class);
                        System.out.println("获取到的json数据新闻内容:"+responseDate);
                        System.out.println("获取到的json数据新闻解析内容:"+newsBean.getError_code());
                        if ("10012".equals("" + newsBean.getError_code())) {
                            List<NewsBean.ResultBean.DataBean> listDataBean = new ArrayList<>();
                            Connection conn = null;
                            if (data.equals("guoji")){
                              dataChina ="国际";
                            }else if (data.equals("tiyu")){
                                dataChina ="体育";
                            }else if (data.equals("yule")){
                                dataChina ="娱乐";
                            }else if (data.equals("caijing")){
                                dataChina ="财经";
                            }else if (data.equals("keji")){
                                dataChina ="科技";
                            }else if (data.equals("guonei")){
                                dataChina ="国内";
                            }else if (data.equals("shehui")){
                                dataChina ="社会";
                            }else if (data.equals("junshi")){
                                dataChina ="军事";
                            }
                            conn = (Connection) DBOpenHelper.getConn();
                            String sql = "select * from news_info where category='"+dataChina+"'";
                            PreparedStatement pstmt;
                            pstmt = (PreparedStatement) conn.prepareStatement(sql);
                            ResultSet rs = pstmt.executeQuery();
                            while (rs.next()) {
                                NewsBean.ResultBean.DataBean dataBean = new NewsBean.ResultBean.DataBean();
                                dataBean.setUniquekey(rs.getString(1));
                                dataBean.setTitle(rs.getString(2));
                                dataBean.setDate(rs.getString(3));
                                dataBean.setCategory(rs.getString(4));
                                dataBean.setAuthor_name(rs.getString(5));
                                dataBean.setUrl(rs.getString(6));
                                dataBean.setThumbnail_pic_s(rs.getString(7));
                                dataBean.setThumbnail_pic_s02(rs.getString(8));
                                dataBean.setThumbnail_pic_s03(rs.getString(9));
                                listDataBean.add(dataBean);
                            }
                            newsBean.setResult(new NewsBean.ResultBean());
                            newsBean.getResult().setData(listDataBean);
                            pstmt.close();
                            conn.close();
                        }
                        JSONObject jsonObject =null;
                        try {
                            jsonObject = new JSONObject(responseDate);
                            JSONObject jsonObject1 = jsonObject.getJSONObject("result");
                            JSONArray jsonArray = jsonObject1.getJSONArray("data");
                            for (int i=0;i<jsonArray.length();i++){
                                JSONObject jsonObject2 = jsonArray.getJSONObject(i);
                                //这里是在新闻类别的点击事件中添加一个插入新闻的具体json数据到news_info表中
                                new Thread(new Runnable() {
                                    @Override
                                    public void run() {
                                        Connection conn = null;
                                        conn = (Connection) DBOpenHelper.getConn();
                                        System.out.print(conn);
                                        String sql = "insert into news_info(uniquekey,title,date,category,author_name,url,thumbnail_pic_s,thumbnail_pic_s02,thumbnail_pic_s03) values(?,?,?,?,?,?,?,?,?)";
                                        int i = 0;
                                        PreparedStatement pstmt;
                                        try {
                                            pstmt = (PreparedStatement) conn.prepareStatement(sql);
                                            pstmt.setString(1,jsonObject2.getString("uniquekey"));
                                            pstmt.setString(2,jsonObject2.getString("title"));
                                            pstmt.setString(3,jsonObject2.getString("date"));
                                            pstmt.setString(4,jsonObject2.getString("category"));
                                            pstmt.setString(5,jsonObject2.getString("author_name"));
                                            pstmt.setString(6,jsonObject2.getString("url"));
                                            pstmt.setString(7,jsonObject2.getString("thumbnail_pic_s"));
                                            pstmt.setString(8,jsonObject2.getString("thumbnail_pic_s02"));
                                            pstmt.setString(9,jsonObject2.getString("thumbnail_pic_s03"));
                                            i = pstmt.executeUpdate();
                                            pstmt.close();
                                            conn.close();
                                        } catch (SQLException e) {
                                            e.printStackTrace();
                                        } catch (JSONException e) {
                                            e.printStackTrace();
                                        }
                                    }
                                }).start();
                            }

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                        Message msg = newsHandler.obtainMessage();
                        msg.what = UPNEWS_INSERT;
                        msg.obj = newsBean;
                        newsHandler.sendMessage(msg);
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }

                }

            }).start();
        }

    }

    private String streamToString(InputStream inputStream, String charset){
        try {
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream,charset);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String s = null;
            StringBuilder builder = new StringBuilder();
            while ((s = bufferedReader.readLine()) != null){
                builder.append(s);
            }
            bufferedReader.close();
            return builder.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;

    }

}

好啦,到此就结束了,可能有部分相关的修改的地方我忘记放在这里了,毕竟写了好几天了,有问题可以欢迎探讨批评指正!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪の星空朝酱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值