目录
第一步:视图创建完成
第二步:绑定视图——创建activity
第三步创建Adapter,但是先创建Adapter所需的样式XML
第四步:创建Adapter
第五步:servlet的json文件
第六步:配置网络权限和视图绑定
/*
* 示例:
* 1,加载服务端的json信息,该信息是由数据库生成的
* 2,json包含的信息: Users对象,该对象的属性:id,name,age,tupain
* 3,这四个属性id我们不用显示,name和age可以存入users,但是图片存储的是头像图片的名字
* 4,我们还要根据这个名字去开启线程来进行下载
* 5,下载后把图片数组和users数组都传入adapter注入到listview
*
* 步骤:
* 定义一个json在servlet----->
* 开启线程获取json----->
* 解析json----->
* 把text信息存入users,把图片名字存图另一个数组----->
* 根据存名字的数组来下载图片----->
* 下载完毕手写自定义的Adapter,在这之前先写一个样式xml----->
* 由于样式视图是一个图片视图和两个TextView视图,所以我们需要的是一个BistBsers和一个ListBitmap----->
* 加上上下文一共三个参数,
* 写完Adapter然后定义一个MaAdapter继承我们自定义的Adapteer----->
* 然后在一个页面把一个listview视图跟这个填充器绑定
*/
package com.example.testloadimage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import com.example.adapter.MyAdapter;
import com.example.entity.Users;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ListView;
import android.widget.Toast;
/*
* 示例:
* 1,加载服务端的json信息,该信息是由数据库生成的
* 2,json包含的信息: Users对象,该对象的属性:id,name,age,tupain
* 3,这四个属性id我们不用显示,name和age可以存入users,但是图片存储的是头像图片的名字
* 4,我们还要根据这个名字去开启线程来进行下载
* 5,下载后把图片数组和users数组都传入adapter注入到listview
*
* 步骤:
* 定义一个json在servlet----->
* 开启线程获取json----->
* 解析json----->
* 把text信息存入users,把图片名字存图另一个数组----->
* 根据存名字的数组来下载图片----->
* 下载完毕手写自定义的Adapter,在这之前先写一个样式xml----->
* 由于样式视图是一个图片视图和两个TextView视图,所以我们需要的是一个BistBsers和一个ListBitmap----->
* 加上上下文一共三个参数,
* 写完Adapter然后定义一个MaAdapter继承我们自定义的Adapteer----->
* 然后在一个页面把一个listview视图跟这个填充器绑定
*/
public class TestActivity extends Activity{
//前台线程
private Handler myHandler;
//解析后存信息的集合
private List lt;
//显示信息的listview
private ListView listview;
//下载线程的图片存储数组
private List bis = new ArrayList();
//需要下载图片的名字,全局变量,图片下载线程可以直接调用
private List load = new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
//绑定视图
super.setContentView(R.layout.index);
//实例所有需要使用的变量
myHandler=new MyHandler();
lt = new ArrayList();
listview = (ListView)this.findViewById(R.id.listView1);
//实例访问解析的线程,并启动
MyThread myThread = new MyThread();
myThread.start();
}
//解析json的线程
class MyThread extends Thread{
@Override
public void run() {
URL url;
HttpURLConnection conn =null;
try {
//存放json的路径
url = new URL("http://192.168.1.103:8080/TestAndroid/Goods.json");
conn = (HttpURLConnection)url.openConnection();
//设置链接权限,和链接最大时间时限,加入机器和网络好可以不用设置
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setConnectTimeout(50000);
//读取服务器端的json文件
InputStream is = conn.getInputStream();
int data =0;
String neirong = "";
while((data = is.read())!=-1) {
neirong+=(char)data;
}
//手动解析线程,把stringjson传入然后获得一个json数组对象
JSONArray array = new JSONArray(neirong);
System.out.println(neirong);
for (int i = 0; i < array.length(); i++) {
//通过遍历获得该数组的每个对象
JSONObject obj = array.getJSONObject(i);
//取出每个对象的属性
int id = obj.getInt("id");
String name = obj.getString("name");
int age = obj.getInt("age");
String tupian = obj.getString("tupian");
//单独的把图片的信息假如到一个数组,等下用来
load.add(tupian);
//把其他信息存入user对象,把对象加入到数组
Users users = new Users(id, name, age, tupian);
lt.add(users);
}
//加载完所有的json信息后开启图片下载线程,下载所有的用户头像
MyLoadThread loadThread = new MyLoadThread();
loadThread.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
//下载图片的线程
class MyLoadThread extends Thread{
@Override
public void run() {
//因为图片不止一张然后就通过循环来下载完
for (int i = 0; i < load.size(); i++) {
try {
//经过解析线程以后,图片的名字已经加入到了名字数组,我们前面的路径是项目的固定网络路径
//在加上对应的图片名字就能访问到该图片
URL url = new URL("http://192.168.1.103:8080/TestAndroid/"+load.get(i));
System.out.println("loadtupian=====>"+url);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setConnectTimeout(50000);
//通过图片路径的输入流,可以直接将输入流的信息变为一张图片
InputStream is = conn.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(is);
//从客户端读取的图片封装成一个图片对象,然后加入到全局变量图片数组中,等下当做参数传入Adapter
bis.add(bitmap);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//当图片下载完成以后,所有的信息就都有了,我们就可以把信息绑定到listview中
//不过后台线程thread是不允许操作前台的控件的,所以我们需要把这个写在前台线程中
Message msg = new Message();
TestActivity.this.myHandler.sendMessage(msg);
}
}
//继承自定义的填充器模式,该填充器可以与一个列表视图进行绑定
class MyAdapter1 extends MyAdapter{
public MyAdapter1(Context context, List lt, List bits) {
super(context, lt, bits);
// TODO Auto-generated constructor stub
}
}
class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
//前台线程的工作就是将listview和Adapter绑定
listview.setAdapter(new MyAdapter1(TestActivity.this, lt, bis));
}
}
}
package com.example.adapter;
import java.util.List;
import org.w3c.dom.Text;
import com.example.entity.Users;
import com.example.testloadimage.R;
import com.example.testloadimage.R.layout;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
/*
* 自定义的Adapter填充器,定义的是用什么样式来填充内容,用来被填充器方法继承
*/
public class MyAdapter extends BaseAdapter{
//上下文
private Context context;
//json解析的信息对象
private List lt;
//解析后的图片名下载成对应的图片
private List bits;
//构造方法,调用这个类型的填充器必须传入三个必须的参数
public MyAdapter(Context context, List lt, List bits) {
super();
this.context = context;
this.lt = lt;
this.bits = bits;
}
//继承BaseAdapter自动生成的四个方法
//一共需要填充几行信息,这个由传过来的lt数组长度来决定
@Override
public int getCount() {
// TODO Auto-generated method stub
return lt.size();
}
//每个下表显示的是后台的那个信息:也可以说是每个下标的内容是什么
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return lt.get(position);
}
//对应的每个下标
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
//最关键的方法,查找视图样式,然后把内容绑定到样式控件里面,然后在显示在listview中
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//布局加载器,需要上下文,Android没有上下文什么都做不了
LayoutInflater inflater = LayoutInflater.from(context);
//用布局加载器获取对应的视图,不过需要给视图id
View view = inflater.inflate(R.layout.title, null);
//获得样式视图以后,就可以获取对应的控件TextView和ImageView
TextView nameText = (TextView)view.findViewById(R.id.textView1);
TextView ageText = (TextView)view.findViewById(R.id.textView2);
ImageView tupain = (ImageView)view.findViewById(R.id.imageView1);
//即使获得了控件,但是信息还没有绑定进入,所以还要把text和image绑定入控件
nameText.setText(lt.get(position).getName());
ageText.setText(""+lt.get(position).getAge());
//这里的是图片bitmap集合,也是三个参数之一
tupain.setImageBitmap(bits.get(position));
//返回的是整个样式
return view;
}
}
[{"id":1,"name":"jin","age":22,"tupian":"jin1.jpg"},
{"id":2,"name":"qian","age":25,"tupian":"jin2.jpg"}]