从网络获取数据并且绑定到listview
从网络获取数据并且绑定到listview
发布时间:2018-02-01 来源:查字典编辑
摘要:从网络获取数据,并绑定到listview上从网络上获取的数据都是JSON格式的,所以要做JSON解析,导入GSON包在APP目录下的buil...

从网络获取数据,并绑定到listview上

从网络上获取的数据都是JSON格式的,所以要做JSON解析,导入GSON包

在APP目录下的build.gradle里面添加:

compile 'com.google.code.gson:gson:2.4'

然后MainActivity里面参考如下代码:

package iot.com.jingjizhaopin;

import android.content.SharedPreferences;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import android.widget.Toast;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import org.json.JSONObject;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    List< Stu > stulist=null;
    ListView listView;

    //设置一个handler,接受子线程传回UI线程的内容
    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            switch (msg.what)
            {
                case 200:
                    //完成数据绑定
                    if(stulist!=null)
                    {
                        //绑定数据
                        StuAdapter stuAdapter=new StuAdapter(stulist,MainActivity.this);
                        listView.setAdapter(stuAdapter);
                    }

                    break;
                case  -1:
                    //获取失败
                    Toast.makeText(MainActivity.this,"获取失败",Toast.LENGTH_SHORT).show();
                    break;
                case -2:
                    //获取发生异常
                    Toast.makeText(MainActivity.this,"获取发生异常",Toast.LENGTH_SHORT).show();
                    break;
                default:
                    //其他情况
                    Toast.makeText(MainActivity.this,"获取发生异常",Toast.LENGTH_SHORT).show();
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView=(ListView)findViewById(R.id.list);

        //从缓存获取数据,获取成功返回true,则绑定本地数据,否则从服务器获取数据
        if(getDataFromCache())
        {
            //绑定数据
            StuAdapter stuAdapter=new StuAdapter(stulist,MainActivity.this);
            listView.setAdapter(stuAdapter);
        }
        else
        {
            //从服务器获取数据
            getDataFromService();

        }
    }

    //这个方法会返回一个判断值,如果在缓存获取成功,则返回true,并且将内容放到stulist里面,否则返回FALSE
    private boolean getDataFromCache()
    {
        try {
            //打开缓存文件『person』
            SharedPreferences sp = MainActivity.this.getSharedPreferences("person", MODE_PRIVATE);
            //获取字段为『studata』的数据
            String data = sp.getString("studata", "");  //所有信息
            JSONObject jsonObject=new JSONObject(data);
            String Data= jsonObject.getString("data");
            //如果获取到了data,则解析它并且将值放到stulist里面
            if (data != "") {
                Gson gson = new Gson();
                stulist = gson.fromJson(Data, new TypeToken< List< Stu > >() {
                }.getType());
                //暂时没有添加时间过期的判断
                return true;
            } else {
                stulist=null;
                return false;
            }
        }catch (Exception ex)
        {
            ex.printStackTrace();
            stulist=null;
            return false;
        }

    }

    private  void getDataFromService()
    {
        final String  path="http://10.10.192.1/stumanage/2.php";
        // 开线程
        new Thread(){
            @Override
            public void run() {
                super.run();
                //获取数据
                try {
                    URL url = new URL(path);
                    HttpURLConnection conn=(HttpURLConnection)url.openConnection();
                    conn.setRequestMethod("GET");  //必须大写
                    conn.setConnectTimeout(5000);
                    Log.d("JHH","try");
                    int code=conn.getResponseCode();
                    if(code==200)
                    {
                        Log.d("JHH","code:200 ");
                        //请求成功
                        InputStream inputStream=conn.getInputStream();
                        //然后把输入流转为字符串 。上网找一个把流转为字符串的函数
                        String abc=inputstream2string(inputStream);
                        //解析json字符串
                        //先拿到code 。 判断code是否等于200
                        // {"code":200,"pageindex":10,"isover":1,"data":[{"name":"u5f20u5b8f90","age":91},{"name":"u5f20u5b8f91","age":92},{"name":"u5f20u5b8f92","age":93},{"name":"u5f20u5b8f93","age":94},{"name":"u5f20u5b8f94","age":95},{"name":"u5f20u5b8f95","age":96},{"name":"u5f20u5b8f96","age":97},{"name":"u5f20u5b8f97","age":98},{"name":"u5f20u5b8f98","age":99},{"name":"u5f20u5b8f99","age":100}]}

                        JSONObject jsonObject=new JSONObject(abc);
                        if(jsonObject.getString("code").equals("200"))
                        {
                            //如果等于200。 服务器数据有效的

                            String Data= jsonObject.getString("data");
                            Gson gson=new Gson();

                            //studata=[{"name":"u5f20u5b8f90","age":91},。。。。]
                            stulist = gson.fromJson(Data, new TypeToken< List< Stu > >(){}.getType());
                            // 程序如果走到这个位置 。说明数据符合json格式。这时候我要把数据使用sharedpreference保存起来
                            //android 内存缓存
                            SharedPreferences sp=getSharedPreferences("person",MODE_PRIVATE); //person是文件名.
                            SharedPreferences.Editor  editor=sp.edit();
                            editor.putString("studata",abc);//按照关键字 studata。 把字符串保存起来
                            editor.apply();

                            Log.d("JHH","获取数据成功");
                            Message message=new Message();
                            message.what=200; //200代码获取数据正常
                            handler.sendMessage(message);
                            Log.d("JHH","向主线程发送消息");
                        }
                        else
                        {
                            //返回码不是200的情况
                            Message message=new Message();
                            message.obj=abc;  //定义带有数据的消息
                            message.what=202; //200代码获取数据正常
                            handler.sendMessage(message);
                            Log.d("JHH","发送消息正常");
                        }


                    }
                    else
                    {
                        //请求失败
                        Message message=new Message();
                        message.what=-1; //-1 代码获取数据失败
                        handler.sendMessage(message);
                        Log.d("JHH","请求失败");
                    }
                }
                catch (Exception ex)
                {
                    Message message=new Message();
                    message.what=-2; //-1 代码获取数据时发生异常情况
                    //发送消息
                    handler.sendMessage(message);
                    Log.d("JHH","Exception");

                }
            }
        }.start();

    }

    //把字节流转换成字符串,这个可以直接拿来用
    private  String inputstream2string(InputStream inputStream)
    {
        try {
            ByteArrayOutputStream baos=new ByteArrayOutputStream();
            int length=0;
            byte[] buffer=new byte[1024];
            while((length=inputStream.read(buffer))!=-1){
                baos.write(buffer, 0, length);
            }
            inputStream.close();
            baos.close();
            return baos.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return "获取失败";
        }
    }
}

listview 的Adapter如下:

public class StuAdapter extends BaseAdapter {
    public  List< Stu > list;
    public Activity activity;
    public StuAdapter(List< Stu > list,Activity activity)
    {
        this.list=list;
        this.activity=activity;
    }
 public void setList(List< Stu > list)
 {
     this.list=list;
 }
    @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) {
        //数据放到模版中
        View view=View.inflate(activity,R.layout.model,null);
        TextView textView_name=(TextView) view.findViewById(R.id.tv_name);
        TextView textView_age=(TextView) view.findViewById(R.id.tv_number);

        //放数据到控件上
        textView_age.setText(list.get(position).getAge()+"");
        textView_name.setText(list.get(position).getName());

        return view;
    }
}

Stu 有两个属性,一个是age,一个是name。name 是String,age 是 int

布局文件中,MainActivity中只有一个listview,如果需要则根据需要添加适当的布局

model布局为listview列表每一项的布局,是一项的布局,代码如下

< ?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="60dp"
 android:layout_marginLeft="10dp"
 android:orientation="horizontal" >

  < ImageView
 android:layout_width="40dp"
 android:layout_height="60dp"
 android:background="@mipmap/ic_launcher"/ >
    < LinearLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:orientation="vertical" >
        < TextView
 android:id="@+id/tv_name"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="name"/ >
        < TextView
 android:id="@+id/tv_number"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="number"/ >
    < /LinearLayout >
< /LinearLayout >
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新安卓软件开发学习
热门安卓软件开发学习
编程开发子分类