ListView和GridView是我们经常会使用的控件,所以它们的效率是一个非常重要的事情,如果我们滑动的时候,会出现停顿的现在,那么,这次是一个非常不好的体验。所以我们有必要要对这些控件进行优化。
其实,我们用这些控件的时候,都是通过adapter来进行给这些控件添加item的,所以我们的优化也就是在adapter里面进行的。其实这个优化方法也很简单,就是在进行view的绘制的时候,我们判断一下,是不是已经绘制过啦,如果绘制过了,那么就使用原来的,如果没有绘制过,那么就重新绘制。直接上代码,大家可以与我们之前写的那个adapter比较一下有什么不同
com.xiaobin.security.adapter.MainUIAdapter
package com.xiaobin.security.adapter; import android.content.Context; import android.content.SharedPreferences; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import com.xiaobin.security.R; public class MainUIAdapter extends BaseAdapter { private static final String[] NAMES = new String[] {"手机防盗", "通讯卫士", "软件管理", "流量管理", "任务管理", "手机杀毒", "系统优化", "高级工具", "设置中心"}; private static final int[] ICONS = new int[] {R.drawable.widget01, R.drawable.widget02, R.drawable.widget03, R.drawable.widget04, R.drawable.widget05, R.drawable.widget06, R.drawable.widget07, R.drawable.widget08, R.drawable.widget09}; private Context context; private LayoutInflater inflater; private SharedPreferences sp; public MainUIAdapter(Context context) { this.context = context; inflater = LayoutInflater.from(this.context); sp = context.getSharedPreferences("config", Context.MODE_PRIVATE); } @Override public int getCount() { return NAMES.length; } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { //convertView 相当于缓存一样,只要我们判断一下它是不是为null,就可以知道现在这个view有没有绘制过出来 //如果没有,那么就重新绘制,如果有,那么就可以使用缓存啦,这样就可以大大的节省view绘制的时间了,进行了优化,使ListView更加流畅 MainViews views; View view; if(convertView == null) { views = new MainViews(); view = inflater.inflate(R.layout.main_item, null); views.imageView = (ImageView) view.findViewById(R.id.iv_main_icon); views.textView = (TextView) view.findViewById(R.id.tv_main_name); views.imageView.setImageResource(ICONS[position]); views.textView.setText(NAMES[position]); view.setTag(views); } else { view = convertView; views = (MainViews) view.getTag(); views.imageView = (ImageView) view.findViewById(R.id.iv_main_icon); views.textView = (TextView) view.findViewById(R.id.tv_main_name); views.imageView.setImageResource(ICONS[position]); views.textView.setText(NAMES[position]); } if(position == 0) { String name = sp.getString("lostName", ""); if(!name.equals("")) { views.textView.setText(name); } } return view; } //================================================================================== //一个存放所有要绘制的控件的类 private class MainViews { ImageView imageView; TextView textView; } }
就这样,我们的GridView就优化好啦,
大家是不是看到别人的应用的Button按下去,或获得焦点,都会有不同的显示的,其实也很简单,我们现在就为我们之前的那些对话框加上这一效果,
其实这些在api文档里面也是有的,在我们的自定义图片这里面就有说到在那里找到那些东西的,有兴趣的可以去看看
现在我们要在drawable目录下面新建一个xml
button_selector.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_pressed="true" android:drawable="@drawable/title_background"></item> <item android:state_focused="true" android:drawable="@drawable/title_background"></item> <item android:drawable="@drawable/button_normal" /><!-- 这个是默认状态下的 --> </selector>
就这样子,我们的一个button在按下去时就会显示成不同的样子的啦,其实还有其他属性的,有兴趣的可以去api那里找一下
好啦,现在只要你想要在那一个Button显示成这个样子,那么你只要把它的Background指定成这个xml就行的啦
<Button android:id="@+id/bt_protected_first_yes" android:layout_width="140dip" android:layout_height="40dip" android:background="@drawable/button_selector" android:text="@string/protectedYes"/>
现在我们如法泡制,为我们的GridView也添加这样一样样式,在按下去时,显示有所不同
在drawable下面新建一个xml
item_background_selector.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_pressed="true" android:drawable="@drawable/item_background_select"></item> </selector>
是不是很简单的呢,不过,要在GridView里面显示这个,那个指定方式,就有些不同啦,我们在GridView里面指定一个这样的属性就可以的啦 listSelector
<GridView android:id="@+id/gv_main" android:layout_width="match_parent" android:layout_height="match_parent" android:listSelector="@drawable/item_background_selector" android:verticalSpacing="8dip" android:layout_marginTop="10dip" android:numColumns="2" />
就这样,我们就可以指定GridView的item按下去时,会显示成不同的样子啦
好啦,今天就到这里啦,如果有什么不明白的,欢迎留言,也可以去看一下,我们之前的文章,毕竟是一直承接下来的,是一个完整的项目来的。
今天源码下载