功能:下拉刷新加载留言+上传留言。
实现:Volley 获取/上传 数据,handler实现异步消息处理,JSON解析,自定义Adapter将数据填入ListView中,SwipeRefreshLayout下拉刷新。
请求接口:http://mclee.cn/getJson.php
上传接口:http://mclee.cn/postJson.php
1)Volley框架—— 获取/上传 数据
Volley是一个网络通信框架,适合进行数据量不大,但网络通信频繁的网络操作。
1.获取数据
①导入Volley的jar包:在build.grade中添加
`compile'com.android.volley:volley:1.0.0'`
②获取RequestQueue对象:
RequestQueue rQueue = Volley.newRequestQueue(MainActitvity.this);
③创建StringRequest对象:
StringRequest stringRequest = new StringRequest("http://mclee.cn/getJson.php",
new Response.Listener<String>(){
public void onResponse(String response){
Message message = handler.obtainMessage();
message.what=1;
message.obj = response;
handler.sendMessage(message);
}
},new Response.ErrorListener(){
public void onErrorResponse(VolleyError error){
handler.sendEmptyMessage(0);
}
});
④将StringRequest对象添加到RequestQueue里:
rQueue.add(StringRequest);
⑤在AndroidManifest.xml中添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
2.上传数据
putMessage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
RequestQueue requestQueue = Volley.newRequestQueue(PostMessage.this);
StringRequest request = new StringRequest(Request.Method.POST,"http://mclee.cn/postJson.php", new Response.Listener<String>() {
@Override
public void onResponse(String response) {
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> map = new HashMap<String, String>();
String result = eText.getText().toString();
map.put("json",result);
return map;
}
};
requestQueue.add(request);
}
});
2)JSON数据解析
Handler handler = new Handler(){
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 1:
JSONArray array = new JSONArray((String)msg.obj);
for (int i =0;i<array.length();i++){
JSONObject object = array.getJSONObject(i);
String result = object.getString("message");
list.add(result);
}
lv.setAdapter(new Adapter(MainActivity.this,list));
break;
case 0:
Toast.makeText(MainActivity.this,"网络异
常",Toast.LENGTH_SHORT).show();
break;
}
}
};
3)自定义Adapter,向ListView中填入数据
public class Adapter extends BaseAdapter {
private TextView textView;
private List<String> list;
private Context context ;
public Adapter (Context context, List<String> list){
this.list = list;
this.context = context;
}
@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 = LayoutInflater.from(context).inflate(R.layout.item,null);
textView=(TextView)view.findViewById(R.id.text);
textView.setText(list.get(position));
return view;
}
}
新建Adapter类继承自BaseAdapter,重写构造方法和默认方法,这里将数据存入list中。
· getCount():返回ListView中要显示的子View数量,只要返回list的条目数就可以了。
· getItem(int position):返回ListView中的一个子条目,这里取list中的一条数据。
· getItemId(int position):根据ListView中的位置返回id。
· getView(int position, View convertView, ViewGroup parent):返回这个条目的整个信息,它是一个单独的布局文件。通过LayoutInflater类的inflate()方法可以根据布局文件获得其View返回值,再对子组件进行设置。
效果图: