一、主页面布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<!--<Button
android:id="@+id/btn1"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="url"/>-->
<Button
android:id="@+id/btn2"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="Httpurl"/>
</LinearLayout>
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
二、适配器布局
<?xml version="1.0" encoding="utf-8"?>
<ImageView
android:id="@+id/image_l"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher_background"/>
<TextView
android:id="@+id/text1_l"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25sp"
android:padding="15dp"
android:text="title"/>
<TextView
android:id="@+id/text2_l"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="time"/>
三、MainActivity代码,数据源:http://www.xieast.com/api/news/news.php?type=top&page=1 public class MainActivity extends AppCompatActivity {
List<NewsRespond.NewsItem> datas = new ArrayList<>();
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找控件
ListView listView = findViewById(R.id.listView);
//设置适配器
adapter = new MyAdapter();
listView.setAdapter(adapter);
//设置单机事件监听
findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//判断是不是没有网络
if(!hasActiviteNetwork()){
Toast.makeText(MainActivity.this,"没有可用的网络",Toast.LENGTH_SHORT).show();
//打开设置界面
startActivity(new Intent(Settings.ACTION_SETTINGS));
return;
}
//请求数据,不能在主线程直接做网络,需要创建线程
new Thread(new Runnable() {
@Override
public void run() {
requestData("http://www.xieast.com/api/news/news.php?type=top&page=1");
}
}).start();
}
});
}
//是否有活动的网络
private boolean hasActiviteNetwork(){
//获取系统服务,连接服务
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
//获取活动的网络信息
NetworkInfo activeNetworkInfo = cm.getActiveNetworkInfo();
//可用网络不为空且可用的话,说明有网
return activeNetworkInfo != null && activeNetworkInfo.isAvailable();
}
//创建handler
private Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
datas.addAll((List<NewsRespond.NewsItem>) msg.obj);
//刷新适配器
adapter.notifyDataSetChanged();
return true;
}
}){};
//请求数据
private void requestData(String urlString) {
//1.地址
try {
URL url = new URL(urlString);
//2.打开连接
try {
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
//请求方法 超时
httpURLConnection.setRequestMethod("GET");
//连接超时
httpURLConnection.setConnectTimeout(5000);
//读取超时
httpURLConnection.setReadTimeout(5000);
//请求状态
int responseCode = httpURLConnection.getResponseCode();
//成功怎么办
if(responseCode == 200){
//读取流
String result = stream2String(httpURLConnection.getInputStream());
NewsRespond respond = new Gson().fromJson(result, NewsRespond.class);
//更新 ui
handler.sendMessage(handler.obtainMessage(0,respond.data));
}
//关闭
httpURLConnection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
//将返回数据流转换成string
private String stream2String(InputStream is) {
StringBuilder sb = new StringBuilder();
//创建增强流
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
try {
//如果不为空就一直读
for (String tmp = reader.readLine(); tmp != null; tmp = reader.readLine()) {
sb.append(tmp);
}
} catch (IOException e) {
e.printStackTrace();
//关流
} finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//返回StringBuilder中的tostring方法
return sb.toString();
}
//适配器
class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
return datas.size();
}
@Override
public NewsRespond.NewsItem getItem(int position) {
return datas.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){
holder = (ViewHolder) convertView.getTag();
}else{
holder = new ViewHolder();
convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.l_item,null);
holder.title = convertView.findViewById(R.id.text1_l);
holder.date = convertView.findViewById(R.id.text2_l);
convertView.setTag(holder);
}
//数据
NewsRespond.NewsItem newsItem = datas.get(position);
holder.title.setText(newsItem.getTitle());
holder.date.setText(newsItem.getDate());
return convertView;
}
class ViewHolder{
public TextView title;
public TextView date ;
}
}
}
四、bean,这里只取了部分数据
public class NewsRespond {
public String msg;
public int code;
public List data;
public class NewsItem {
public String title;
public String date;
public String url;
public String getTitle() {
return title;
}
public String getDate() {
return date;
}
public String getUrl() {
return url;
}
}
public String getMsg() {
return msg;
}
public int getCode() {
return code;
}
public List<NewsItem> getData() {
return data;
}
}
需要配置两个权限: