listview
来源:互联网 发布:流量防火墙软件 编辑:程序博客网 时间:2024/06/01 14:14
备份短信需要在AndroidMainfest.xml中添加权限:
<uses-permission android:name="android.permission.READ_SMS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
- 在APP目录下的build.gradle里面添加:
compile 'com.google.code.gson:gson:2.4'
先写一个activity main:
<ListView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="match_parent"></ListView>
写model布局
- 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>
再写stu
public class Stu{ String name; int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }}
再写StuAdapter
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; }}
然后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":"\u5f20\u5b8f90","age":91},{"name":"\u5f20\u5b8f91","age":92},{"name":"\u5f20\u5b8f92","age":93},{"name":"\u5f20\u5b8f93","age":94},{"name":"\u5f20\u5b8f94","age":95},{"name":"\u5f20\u5b8f95","age":96},{"name":"\u5f20\u5b8f96","age":97},{"name":"\u5f20\u5b8f97","age":98},{"name":"\u5f20\u5b8f98","age":99},{"name":"\u5f20\u5b8f99","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":"\u5f20\u5b8f90","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 "获取失败"; } }}
阅读全文
0 0
- listview
- listview
- listview
- ListView
- ListView
- listview
- listview
- listView
- ListView
- ListView
- ListView
- listview
- LIstView
- ListView
- listview
- ListView
- ListView
- ListView
- 线性表顺序存储结构的操作
- Java 并发工具包 java.util.concurrent
- Jquery操作table
- css测验
- 面试题49—把字符串转化成整数
- listview
- 2017年5月iOS招人心得答案总结(中级篇)
- Spring MVC 的常用注解
- 【Spring】Junit加载Spring容器作单元测试
- Centos端口开启
- 在Laya里面显示系统时间
- 事务-----并发控制
- CRC检验解析
- 浏览器头部兼容设置