1 listview中的修改与删除:
删除:remove(arg2);arg2为在listview中要删除数据的位置。
adapter.notifyDataSetChange();更新当前listview
修改:listview.add(arg2,map);将新的数据加载到当前位置。
adapter.notifyDataSetChange();更新当前listview
2 listview拖动时背景黑色问题(有时直接用触摸屏拖动视图时会发现listview的背景一片黑色。而且所有被选中的文字都变成一片漆黑。)这个问题在于listview缓存颜色机制,因此我们可以通过设置缓存颜色为透明的方法来解决。
法1:通过布局属性来设定(listview的属性中直接定义)android:cacheColorHint = "#000000"
法2:在代码中设定 listview.setCacheColorHint(Color.TRANSPARENT);
3 listview中的属性功能:
a : divider属性:用来设置每一项之间需要设置一个图片作为间隔,或是去掉item之间的分割线 android:divider = "@drawable/list_dirver"其中@drawable/list_dirver是一个图片资源,如果不想显示分割线则子要设为:android:divider = "@drawable/@null"即可。
b:fadingEdge属性:上边和下边有黑色的阴影。android:fadingEdge = "none"设置之后就没有阴影了。
c:scrollbars属性:隐藏listview滚动条。android:scrollbars = "none"与setVerticalScrollBarEnabled(true);的效果是一样的。不活动/活动的时候都隐藏。
d:fadescrollbars属性:android:fadescrollbars = "true"配置listview布局的时候,设置这个属性为true就可以实现滚动条的自动隐藏和显示。
e:stackFromBottom属性:设置好该属性之后你做好的列表就会显示你列表的最下面,值为true和false
android:stackFromBottom="true"
f:transciptMode属性,需要用ListView或者其它显示大量Items的控件实时跟踪或者查看信息,并且希望最新的条目可以自动滚动到可视范围内。通过设置的控件transcriptMode属性可以将Android平台的控件(支持ScrollBar)自动滑动到最底部。android:transcriptMode="alwaysScroll"
e:setSelection(position):记录listView显示在屏幕上的第一个item的位置,然后利用listView.setSelection恢复。打开一个listview的时候能够自动设置显示的位置,
setSelection(int pos)可以设置显示的位置.
本文档有待补充。
一、整体代码图
PipedStreamDemo.java
import java.io.*; class PipedStreamDemo { public static void main(String[] args) throws Exception { PipedInputStream pin = new PipedInputStream(); PipedOutputStream pout = new PipedOutputStream(); pin.connect(pout); //输入流与输出流连接 ReadThread readTh = new ReadThread(pin); WriteThread writeTh = new WriteThread(pout); new Thread(readTh).start(); new Thread(writeTh).start(); } public static void sop(Object obj) //打印 { System.out.println(obj); } } class ReadThread implements Runnable { private PipedInputStream pin; ReadThread(PipedInputStream pin) // { this.pin=pin; } public void run() //由于必须要覆盖run方法,所以这里不能抛,只能try { try { sop("R:读取前没有数据,阻塞中...等待数据传过来再输出到控制台..."); byte[] buf = new byte[1024]; int len = pin.read(buf); //read阻塞 sop("R:读取数据成功,阻塞解除..."); String s= new String(buf,0,len); sop(s); //将读取的数据流用字符串以字符串打印出来 pin.close(); } catch(Exception e) { throw new RuntimeException("R:管道读取流失败!"); } } public static void sop(Object obj) //打印 { System.out.println(obj); } } class WriteThread implements Runnable { private PipedOutputStream pout; WriteThread(PipedOutputStream pout) { this.pout= pout; } public void run() { try { sop("W:开始将数据写入:但等个5秒让我们观察..."); Thread.sleep(5000); //释放cpu执行权5秒 pout.write("W: writePiped 数据...".getBytes()); //管道输出流 pout.close(); } catch(Exception e) { throw new RuntimeException("W:WriteThread写入失败..."); } } public static void sop(Object obj) //打印 { System.out.println(obj); } }
二、解释
代码地址:https://github.com/jltxgcy/Demo
来源http://www.oschina.net/question/157182_45912
参考http://developer.android.com/tools/debugging/debugging-tracing.html
一、 首先啥都不做:
public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.listview, null); TextView text = (TextView) layout.findViewById(R.id.text); ImageView view= (ImageView) layout.findViewById(R.id.iamge); text.setText(listData.get(position)); int id= position %2==1? R.drawable.icon: R.drawable.default_head; view.setImageResource(id); return layout; }
运行程序,然后随意的拖动listview 列表,然后安菜单键退出程序:去ddms 中fileExplorer中 点击sd卡 你会早根目录上看到dmtrace.trace 文件,把dmtrace.trace 导出到C盘 ,命令行键入android tools 文件夹下 执行traceview C:\dmtrace.trace,出现了traceview视图。
因为咋门看到的是getview优化操作:所以直接在Find: 键入getView 他则会找到我们写的程序的方法:
看到没有:未进行优化的情况下:getView占用资源是 35.2% 其中布局填充(inflate)占其中的89.7% 整个程序中inflated 就占33%,getView()方法就是全被布局填充耗费了这么多的资源, 看不下去了。
二、优化一
直接加两行代码
if(convertView ==null){ layout = (LinearLayout) inflater.inflate(R.layout.listview, null); }else{ layout =(LinearLayout) convertView; }
看到没有,看到没有:9.4% 占整个程序的9.4% ,并且 inflated 在getview中只耗费了41.7%了,一半多的节省啊!
两行的代码就带来这么大的效率提高: 难道你没觉察到! 神奇
三、优化二
下面是网上盛传的:ViewHolder 优化测试,通过setTAG
public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub // LinearLayout layout; // if(convertView ==null){ // layout = (LinearLayout) inflater.inflate(R.layout.listview, null); // }else{ // layout =(LinearLayout) convertView; // } // // TextView text = (TextView) layout.findViewById(R.id.text); // ImageView view= (ImageView) layout.findViewById(R.id.iamge); // // text.setText(listData.get(position)); // int id= position %2==1? R.drawable.icon: R.drawable.default_head; // view.setImageResource(id); ViewHolder holder; if (convertView == null) { convertView = inflater.inflate(R.layout.listview, null); holder = new ViewHolder(); holder.view = (ImageView) convertView.findViewById(R.id.iamge); holder.text = (TextView) convertView.findViewById(R.id.text); convertView.setTag(holder); } else{ holder = (ViewHolder)convertView.getTag(); } int id= position %2==1? R.drawable.icon: R.drawable.default_head; holder.view.setImageResource(id); holder.text.setText(listData.get(position)); return convertView; } static class ViewHolder { TextView text; ImageView view; }
可以,性能并未提高多少。