最新实战教程,让你了解Android自动化刷量、作弊与防作弊的那些事,案例:刷友盟统计、批量注册苹果帐号
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按下去时,会显示成不同的样子啦
好啦,今天就到这里啦,如果有什么不明白的,欢迎留言,也可以去看一下,我们之前的文章,毕竟是一直承接下来的,是一个完整的项目来的。