从网络获取数据并且绑定到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 >