Android项目实战--手机卫士06--GridView的优化与修改Button的显示样式

 

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那里找一下

Android项目实战--手机卫士06--GridView的优化与修改Button的显示样式_第1张图片

 

好啦,现在只要你想要在那一个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按下去时,会显示成不同的样子啦

 

好啦,今天就到这里啦,如果有什么不明白的,欢迎留言,也可以去看一下,我们之前的文章,毕竟是一直承接下来的,是一个完整的项目来的。

 

今天源码下载

你可能感兴趣的:(Android开发,项目实战,手机卫士)