Android-获取json 、解析json、显示json、下拉列表、线程
Android源码+Springboot服务器
https://download.****.net/download/xiaoxin0630/11106276
总体UI的代码 适配器 重新封装
package dialog.com.binglian.ui;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
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.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import dialog.com.binglian.R;
import dialog.com.binglian.entity.Road;
import dialog.com.binglian.utils.JsonAdapter;
public class UrlActivity extends AppCompatActivity {
private Spinner spinner;
private ListView listView;
private BufferedReader bufferedReader;
public List<Road> lists=null;
private Button button;
private JsonAdapter jsonAdapter;
final String host="http://binglian066.natapp1.cc/hlv";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_url);
listView=(ListView) findViewById(R.id.lv_list1);
spinner=(Spinner) findViewById(R.id.spinner);
lists=new ArrayList<>();
new Thread(new Runnable() {
@Override
public void run() {
try {
parseJsonData(readParse(host));
System.out.println("dada:"+lists.get(1).getLukou());
for(Road news:lists){
Log.i("lukou:",news.getLukou());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
//这里休眠是为了让子线程结束 lists才有值
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("dare1"+lists.get(1).getLukou());
jsonAdapter=new JsonAdapter(this,lists);
listView.setAdapter(jsonAdapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, final int position, long id) {
button= findViewById(R.id.btn_paixu);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取资源下的数组中的Spinner中order下的值
getResources().getStringArray(R.array.order);
getResources().getStringArray(R.array.order);
Log.d("233",""+getResources().getStringArray(R.array.order)[position]);
}
});
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
/**
* 从指定的URL中获取数组
* @param urlPath
* @return
* @throws Exception
*/
public static String readParse(String urlPath) throws Exception {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] data = new byte[1024];
int len = 0;
URL url = new URL(urlPath);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
InputStream inStream = conn.getInputStream();
while ((len = inStream.read(data)) != -1) {
outStream.write(data, 0, len);
}
inStream.close();
return new String(outStream.toByteArray());//通过out.Stream.toByteArray获取到写的数据
}
private void parseJsonData(String string){
lists = new ArrayList<>();
try {
JSONArray jsonArray=new JSONArray(string);
for(int i=0;i<jsonArray.length();i++){
JSONObject jsonObject=jsonArray.getJSONObject(i);
Road road = new Road();
road.setLukou(jsonObject.getString("lukou"));
road.setRed(jsonObject.getString("red"));
road.setYellow(jsonObject.getString("yellwo"));
road.setGreen(jsonObject.getString("green"));
lists.add(road);
// String lukou=jsonObject.getString("lukou");
// String red=jsonObject.getString("red");
// String yellwo=jsonObject.getString("yellwo");
// String green=jsonObject.getString("green");
// System.out.println("lukou:"+lukou+",red:"+red+",yellow:"+yellwo+",greend:"+green);
}
Log.i("Test", "OK,数据存储完成");
Log.i("Test", "List长度为:"+lists.size());
} catch (JSONException e) {
e.printStackTrace();
}
}
}
封装的适配器
package dialog.com.binglian.utils;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.List;
import dialog.com.binglian.R;
import dialog.com.binglian.entity.Road;
public class JsonAdapter extends BaseAdapter {
private List<Road> list;
private Context context;
private LayoutInflater inflater;
public JsonAdapter(Context context,List<Road> list){
this.list=list;
this.context=context;
inflater=LayoutInflater.from(context);
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder=null;
if(convertView ==null){
convertView=inflater.inflate(R.layout.item,null);
holder=new Holder(convertView);
convertView.setTag(holder);
}else{
holder=(Holder) convertView.getTag();
}
Road road=list.get(position);
holder.Rd.setText(road.getLukou());
holder.red.setText(road.getRed());
holder.yello.setText(road.getYellow());
holder.green.setText(road.getGreen());
return convertView;
}
class Holder{
private TextView Rd,red,yello,green;
public Holder(View view){
Rd=(TextView) view.findViewById(R.id.tv_road);
red=(TextView) view.findViewById(R.id.tv_red);
yello=(TextView) view.findViewById(R.id.tv_yellowlight);
green=(TextView) view.findViewById(R.id.tv_greenlight);
}
}
}
json传过来的实体类
package dialog.com.binglian.entity;
public class Road {
private String lukou;
private String red;
private String yellow;
private String green;
public String getLukou() {
return lukou;
}
public void setLukou(String lukou) {
this.lukou = lukou;
}
public String getRed() {
return red;
}
public void setRed(String red) {
this.red = red;
}
public String getYellow() {
return yellow;
}
public void setYellow(String yellow) {
this.yellow = yellow;
}
public String getGreen() {
return green;
}
public void setGreen(String green) {
this.green = green;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Spinner
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:entries="@array/order"/>
<Button
android:id="@+id/btn_paixu"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="排序"/>
</LinearLayout>
<ListView
android:id="@+id/lv_list1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>
listView的item文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_road"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="路口"/>
<TextView
android:id="@+id/tv_red"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="红灯时长/s"/>
<TextView
android:id="@+id/tv_greenlight"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="绿灯时长/s"/>
<TextView
android:id="@+id/tv_yellowlight"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="黄灯时长/s"/>
</LinearLayout>
</LinearLayout>
Spinner下拉内容 xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="order">
<item>红灯将序</item>
<item>绿灯将序</item>
</string-array>
</resources>
首先需要获取json数据
json地址是自己写的一个springboot服务器,
当时试了很多获取的方法 但是 虽然能获取到 解析不出来 这就是一个问题
我这里使用了这个方法就可以解析到
/**
* 从指定的URL中获取数组
* @param urlPath
* @return
* @throws Exception
*/
public static String readParse(String urlPath) throws Exception {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] data = new byte[1024];
int len = 0;
URL url = new URL(urlPath);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
InputStream inStream = conn.getInputStream();
while ((len = inStream.read(data)) != -1) {
outStream.write(data, 0, len);
}
inStream.close();
return new String(outStream.toByteArray());//通过out.Stream.toByteArray获取到写的数据
}
解析json数据
获取传过来的数据 进行解析
JsonArray 传到JSONArray
然后再用jsonArray.getJSONObject一一取出来
然后再给Road对象 在添加到list中
private void parseJsonData(String string){
lists = new ArrayList<>();
try {
JSONArray jsonArray=new JSONArray(string);
for(int i=0;i<jsonArray.length();i++){
JSONObject jsonObject=jsonArray.getJSONObject(i);
Road road = new Road();
road.setLukou(jsonObject.getString("lukou"));
road.setRed(jsonObject.getString("red"));
road.setYellow(jsonObject.getString("yellwo"));
road.setGreen(jsonObject.getString("green"));
lists.add(road);
// String lukou=jsonObject.getString("lukou");
// String red=jsonObject.getString("red");
// String yellwo=jsonObject.getString("yellwo");
// String green=jsonObject.getString("green");
// System.out.println("lukou:"+lukou+",red:"+red+",yellow:"+yellwo+",greend:"+green);
}
Log.i("Test", "OK,数据存储完成");
Log.i("Test", "List长度为:"+lists.size());
} catch (JSONException e) {
e.printStackTrace();
}
}
然后这个是子线程中调用方法
parseJsonData(readParse(host));
这就是传递URL地址获取json数据 然后解析数据
这里我当时因为没有学过Android的线程 发现 只要出了Thread list数据获取不到 所需要需要把数据更新到主线程中
new Thread(new Runnable() {
@Override
public void run() {
try {
parseJsonData(readParse(host));
System.out.println("dada:"+lists.get(1).getLukou());
for(Road news:lists){
Log.i("lukou:",news.getLukou());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
我这里用的是休眠的方法
然后我这里设置了设配器需要显示出来 把list传递到自定义的适配器
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("dare1"+lists.get(1).getLukou());
jsonAdapter=new JsonAdapter(this,lists);
listView.setAdapter(jsonAdapter);
自定义适配器
inflater=Layoutflater.from(context);
这里自定义构造方法 传递参数进来
public JsonAdapter(Context context,List<Road> list){
this.list=list;
this.context=context;
inflater=LayoutInflater.from(context);
}
这里是判断是否第一次缓存运行
Holder holder=null;
if(convertView ==null){
convertView=inflater.inflate(R.layout.item,null);
holder=new Holder(convertView);
convertView.setTag(holder);
}else{
holder=(Holder) convertView.getTag();
}
package dialog.com.binglian.utils;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.List;
import dialog.com.binglian.R;
import dialog.com.binglian.entity.Road;
public class JsonAdapter extends BaseAdapter {
private List<Road> list;
private Context context;
private LayoutInflater inflater;
public JsonAdapter(Context context,List<Road> list){
this.list=list;
this.context=context;
inflater=LayoutInflater.from(context);
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder=null;
if(convertView ==null){
convertView=inflater.inflate(R.layout.item,null);
holder=new Holder(convertView);
convertView.setTag(holder);
}else{
holder=(Holder) convertView.getTag();
}
Road road=list.get(position);
holder.Rd.setText(road.getLukou());
holder.red.setText(road.getRed());
holder.yello.setText(road.getYellow());
holder.green.setText(road.getGreen());
return convertView;
}
class Holder{
private TextView Rd,red,yello,green;
public Holder(View view){
Rd=(TextView) view.findViewById(R.id.tv_road);
red=(TextView) view.findViewById(R.id.tv_red);
yello=(TextView) view.findViewById(R.id.tv_yellowlight);
green=(TextView) view.findViewById(R.id.tv_greenlight);
}
}
}
下拉列表
监听事件
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, final int position, long id) {
button= findViewById(R.id.btn_paixu);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getResources().getStringArray(R.array.order);
getResources().getStringArray(R.array.order);
Log.d("233",""+getResources().getStringArray(R.array.order)[position]);
}
});
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});