博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
08 ListView 优化的例子
阅读量:4967 次
发布时间:2019-06-12

本文共 6382 字,大约阅读时间需要 21 分钟。

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; }}

转载于:https://www.cnblogs.com/muyuge/p/6152278.html

你可能感兴趣的文章
ActionBar在Android2.x的实现,类似新版微信界面。
查看>>
python_day1
查看>>
访问者模式(Visitor)
查看>>
linux 重新编译低版本gcc
查看>>
git log 查看某文件的修改历史
查看>>
列的拼接
查看>>
CSS3小模块hover左右交替互换动画
查看>>
JVM垃圾收集器
查看>>
在火狐浏览器中获得borderColor的值
查看>>
codeforces-gym101982E(最小割)
查看>>
详解Struts2拦截器机制
查看>>
codeforces 817C Really Big Numbers
查看>>
Zjoi2017树状数组
查看>>
jquery Ajax的使用
查看>>
Educational Codeforces Round 32 E 巨型背包
查看>>
python读取目录下的相似文件进行合并
查看>>
从头开始搭建一个mybatis+postgresql平台
查看>>
js 判断用户是手机端还是电脑端访问
查看>>
The quieter you become,The more you are able to hear.
查看>>
JTree实现文件树
查看>>