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