最近在做一个关于ListView和网络请求的一个小demo,话不多说,上马,第一次写博客,不足之处望大家见谅。
MainActivity.java
public class MainActivity extends AppCompatActivity {
private String[] data ={};
private MyHandler handler;
ListView listView;
private MyAdapter adapter;
ArrayList<IconTextBean.bean> list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler = new MyHandler();
listView = findViewById(R.id.showListView);
adapter = new MyAdapter(this,list);
listView.setAdapter(adapter);
//网络请求数据,通过Java Bean进行处理
getNetworkData();
}
//从网络得到的数据进行解析,
class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
String s = (String)msg.obj;
JsonObject jsonObject = (JsonObject) new JsonParser().parse(s);
try {
JsonArray jsonArray = jsonObject.get("data").getAsJsonArray();
Gson gson = new Gson();
//GSON直接解析成对象
list = gson.fromJson(jsonArray, new TypeToken<List<IconTextBean.bean>>() {}.getType());
if (list.size()>0){
adapter.update(list);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void getNetworkData (){
new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL("可以用一些免费的天气JSON API");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();//开启连接
//超时时间
connection.setConnectTimeout(3000);
//表示设置本次http请求使用GET方式
connection.setRequestMethod("GET");
// connection.connect();//连接服务器
if (connection.getResponseCode() == 200) {
//使用字符流形式进行回复
InputStream is = connection.getInputStream();
//读取信息BufferReader
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuffer buffer = new StringBuffer();
String readLine = "";
while ((readLine = reader.readLine()) != null) {
buffer.append(readLine);
}
is.close();
reader.close();
connection.disconnect();
Message msg = handler.obtainMessage();
msg.obj= buffer.toString();
handler.sendMessage(msg);
Log.d("Kerwin", buffer.toString());
} else {
Log.d("Kerwin", "ERROR CONNECTED");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
MyAdapter.java
public class MyAdapter extends BaseAdapter {
private ArrayList<IconTextBean.bean> datas;
private Context mContext;
public MyAdapter(Context context, ArrayList<IconTextBean.bean> list) {
this.mContext = context;
this.datas = list;
}
//异步更新数据
public void update( ArrayList<IconTextBean.bean> list) {
this.datas = list;
//填充数据
notifyDataSetChanged();
}
@Override
public int getCount() {
return datas.size();
}
@Override
public Object getItem(int i) {
return datas.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder vh = new ViewHolder();
if (view == null) {
view = LayoutInflater.from(mContext).inflate(R.layout.icon_text, null);
vh.pic = (ImageView) view.findViewById(R.id.car_icom);
vh.name = (TextView) view.findViewById(R.id.car_name);
view.setTag(vh);
} else {
vh = (ViewHolder) view.getTag();
}
vh.name.setText(datas.get(i).getName());
Glide.with(mContext)
.load(datas.get(i).getPicurl())
.into(vh.pic);
return view;
}
class ViewHolder {
TextView name;
ImageView pic;
}
AndroidManifest加入权限<uses-permission android:name="android.permission.INTERNET"/>
activity_main.xml
<ListView
android:id="@+id/showListView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
icon_text.xml这里我是用了horizontal这个属性让得到的图标和文字横向排列,具体需要什么样的布局自己定
<ImageView
android:id="@+id/car_icom"
android:layout_width="60dp"
android:layout_height="60dp" />
<TextView
android:id="@+id/car_name"
android:layout_marginLeft="20dp"
android:textColor="@android:color/black"
android:textSize="18sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
Bean文件就不放出来