zoukankan      html  css  js  c++  java
  • 08 ListView 优化的例子

    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<String, Void, List<String>>{
    
    		@Override
    		protected List<String> doInBackground(String... params) {
    			String json = HttpUtil.conn(params[0]);
    			 
    			return ParseXmlUtil.parse(json);
    		}
    		
    		@Override
    		protected void onPostExecute(List<String> 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<String> list = null;
    	//传入的上下文 方便后面用布局填充器
    	Context context = null;
    
    
    	public MyAdpter(List<String> 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<String> parse(String json){
            List<String> list= new ArrayList<String>();
            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;
        }
    }





  • 相关阅读:
    Objective-C语法之NSDictionary和NSMutableDictionary
    Objective-C语法之指针型参数
    Objective-C语法之nonatomic和atomic之间的区别
    Objective-C语法之NSSortDescriptor
    Objective-C语法之NSPredicate的使用
    SimPholders2 模拟器 App 文件路径查看工具
    清除 Xcode 项目缓存
    Xcode 6 免证书真机调试
    [转]iOS证书(.p12)和描述文件(.mobileprovision)申请
    WWDC 2015大会到来了
  • 原文地址:https://www.cnblogs.com/muyuge/p/6152278.html
Copyright © 2011-2022 走看看