package com.fmy.homework;import java.util.List;import com.fmy.homework.httputil.HttpUtil;import com.fmy.homework.myadapter.MyAdpter;import com.fmy.homework.parsexml.ParseXmlUtil;import android.app.Activity;import android.os.AsyncTask;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.AdapterView.OnItemLongClickListener;import android.widget.ListView;import android.widget.TextView;public class MainActivity extends Activity { private ListView lv; private TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (ListView) findViewById(R.id.lv); tv = (TextView) findViewById(R.id.tv); //设置当List没有条目显示此控件 如果有隐藏此控件 //注意头尾视图不包含在内 意思说哪怕有头尾视图但没有实际条目依然为空 lv.setEmptyView(tv); //创建一个布局填充器 LayoutInflater inflater = getLayoutInflater(); //把布局文件填充为一个View View head = inflater.inflate(R.layout.head, null); //把布局文件填充为一个View View foot = inflater.inflate(R.layout.foot, null); //添加头试图 lv.addHeaderView(head); //添加尾视图 lv.addFooterView(foot); //启动异步任务 new MyAsync().execute("http://c.m.163.com/nc/article/list/T1348648517839/0-20.html"); } class MyAsync extends AsyncTask >{ @Override protected List doInBackground(String... params) { String json = HttpUtil.conn(params[0]); return ParseXmlUtil.parse(json); } @Override protected void onPostExecute(List result) { super.onPostExecute(result); MyAdpter myAdpter = new MyAdpter(result, MainActivity.this); lv.setAdapter(myAdpter); //如果lv中某个条目设置setOnClickListener //那么本方式和长按方法不生效 lv.setOnItemClickListener(new OnItemClickListener() { /** * 第一个参数 ListView * 第二个参数当前条目的View * 当前条目的位置包括头试图的位置 比如说头试图(headView) 的值是0 调用的是适配器中:getItem * 当前实际内容条目的ID 如果直接返回的是postion的话 那么返回的是实际条目内容地址 * 接上:不包括头试图和尾视图 两者的返回值是 -1 调用的是适配器中:getItemId */ @Override public void onItemClick(AdapterView parent, View view, int position, long id) { } }); //按下的时间是0.18s 触发 lv.setOnItemLongClickListener(new OnItemLongClickListener() { /** * 第一个参数 ListView * 第二个参数当前条目的View * 当前条目的位置包括头试图的位置 比如说头试图(headView) 的值是0 调用的是适配器中:getItem * 当前实际内容条目的ID 如果直接返回的是postion的话 那么返回的是实际条目内容地址 * 接上:不包括头试图和尾视图 两者的返回值是 -1 调用的是适配器中:getItemId */ /* * 这里的返回值 :如果是false 长按之后还会触发短按监听 * */ @Override public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { return false; } }); } } }
package com.fmy.homework.httputil;import java.io.IOException;import org.apache.http.HttpResponse;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.params.CoreConnectionPNames;import org.apache.http.util.EntityUtils;import org.json.JSONObject;public class HttpUtil { static public String conn(String url){ HttpClient client = new DefaultHttpClient(); client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 1000*5); HttpGet get = new HttpGet(url); try { HttpResponse response = client.execute(get); if (response.getStatusLine().getStatusCode()==200){ return EntityUtils.toString(response.getEntity()); } } catch (Exception e) { e.printStackTrace(); } return url; }}
package com.fmy.homework.myadapter;import java.util.List;import com.fmy.homework.R;import android.content.Context;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;public class MyAdpter extends BaseAdapter { //每个item中要显示的数据 List list = null; //传入的上下文 方便后面用布局填充器 Context context = null; public MyAdpter(List list, Context context) { super(); this.list = list; this.context = context; } // 返回列表中所有数量 // 如果设置为1 那么列表将只有一个item (只有一行) @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } // 返回每个显示内容的位置 如果同时设置头(headView)和尾试图(footView) // 也包含在内 所以 头的数值为:0 总大小比getCount+2 @Override public Object getItem(int position) { return position; } // 返回内容的每个条目的id 如果没有直接返回 positon那么将直接返回实际内容 // 头(headView)和尾试图(footView) 返回-1 其他正常显示 @Override public long getItemId(int position) { return position; } /* * position 实际内容位置(不包含头尾): convertView 每个条目的缓存 parent指代listView */ @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; viewHold hold =null; // 判断缓存是否为空 if (convertView == null) { //生成布局填充器 LayoutInflater Inflater = LayoutInflater.from(context); //用填充器生成一个view对象 /** * 第一个参数 :需要从布局文件转化为view的id * 第二个参数:ListView对象 * 第三个参数:是否追加 填充对象的父级 如果为true 生成的条目将会有两个布局(ListView 转化的布局文件) 会直接奔溃 */ view = Inflater.inflate(android.R.layout.simple_spinner_item, parent,false); //生成一个存放view子空间的id 省去下次遍历id带来的消耗 hold = new viewHold(); //给hold放入子控件对象 hold.tv = (TextView) view; //将hold装入view中 view.setTag(hold); }else{ //如果存在缓存 从缓存中拿出即可 view = convertView; //拿出存放控件id的类 hold = (viewHold) view.getTag(); } //设置样式 hold.tv.setText(list.get(position)); return view; } // 保存缓存item子控件的id // 到用时候不用重新findView(此方法遍历整个id文件比较浪费资源) class viewHold { TextView tv; }}
package com.fmy.homework.parsexml;import java.util.ArrayList;import java.util.List;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;public class ParseXmlUtil { static public List parse(String json){ List list= new ArrayList (); try { JSONObject root = new JSONObject(json); JSONArray jsonArray = root.getJSONArray("T1348648517839"); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); String string = jsonObject.getString("title"); list.add(string); } return list; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }}