有人说用selector,其实没这么简单,因为选中后要一直处于突现状态,并且选中其他item时要切换成选中的item为突现。
最初我是传递选中的position,然后去重绘View,然而在性能上不容乐观。
效果图:
主要代码:
import cn.qhg.dataadapter.ZbGridViewAdapter;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
/**
* 新增账本
*
* @author qhg
* @date 2014年3月19日
*
*/
public class ZbTypeAddFragment extends Fragment {
private View view;
private Button btn_back;
private ImageView icon_mini;
private TextView tv_zbNameAdd;
private String zbName;
private int miniIconResId;
private GridView gView;
private int iconResId = ZbGridViewAdapter.book_icon_array[0];
public ZbTypeAddFragment(String zbName, int miniIconResId) {
this.zbName = zbName;
this.miniIconResId = miniIconResId;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.zbtypeadd_fragment, container, false);
btn_back = (Button) view.findViewById(R.id.btn_back);
icon_mini = (ImageView) view.findViewById(R.id.iv_zbIconAdd);
tv_zbNameAdd = (TextView) view.findViewById(R.id.tv_zbNameAdd);
btn_back.setText("添加" + zbName);
icon_mini.setBackgroundResource(miniIconResId);
tv_zbNameAdd.setText(zbName);
gView = (GridView) view.findViewById(R.id.gv_zbIconsAdd);
gView.setSelector(new ColorDrawable(Color.TRANSPARENT));
gView.setAdapter(new dataAdapter(0));
gView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// 传递选中的position到adapter里去重绘GridView当前列的背景色
gView.setAdapter(new dataAdapter(position));
changeIcon(position);
}
});
return view;
}
/**
* 新增账本
*/
public void AddZb() {
Log.i("Other", zbName + "," + iconResId);
}
/**
* 选择不同的item显示不同的miniIcon
*
* @param position
*/
public void changeIcon(int position) {
iconResId = ZbGridViewAdapter.book_icon_array[position];
icon_mini
.setBackgroundResource(ZbGridViewAdapter.book_icon_array_mini[position]);
}
class dataAdapter extends BaseAdapter {
private ViewHolder holder;
private int position;
public dataAdapter(int position) {
this.position = position;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return ZbGridViewAdapter.book_icon_array.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return ZbGridViewAdapter.book_icon_array[position];
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (null == convertView) {
Log.i("Other", "aaaa");
holder = new ViewHolder();
convertView = getActivity().getLayoutInflater().inflate(
R.layout.zbtypeadd_gvzbitems_item, parent, false);
holder.zbIcon = ((ImageView) convertView
.findViewById(R.id.iv_zbAdd_Icon));
holder.iv_zbAdd_SelectedStatus = (ImageView) convertView
.findViewById(R.id.iv_zbAdd_SelectedStatus);
holder.zbIcon
.setBackgroundResource(ZbGridViewAdapter.book_icon_array[position]);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (this.position == position) {
convertView.setBackgroundColor(Color.parseColor("#FFF8D7"));
holder.iv_zbAdd_SelectedStatus.setVisibility(View.VISIBLE);
} else {
convertView.setBackgroundColor(Color.parseColor("#FFFFFF"));
holder.iv_zbAdd_SelectedStatus.setVisibility(View.GONE);
}
return convertView;
}
}
static class ViewHolder {
ImageView zbIcon;
ImageView iv_zbAdd_SelectedStatus;
}
}
这样虽然能达到预期的效果,但每次都会去重绘GridView,在性能上是极差的。仔细看了一下onItemClick这个事件的参数,
AdapterView<?> parent 装载好了的View,也就是整个GridView
View view 当前选中的view,也就是item
int position 当前选中的item在GridView中的位置
long id (暂无)
既然知道了整个AdapterView,也知道当前的选中位置和View,那么是不是可以直接在这里做突现切换呢,于是写了个循环来判断哪个item该突现。
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// 传递选中的position到adapter里去重绘GridView当前列的背景色
// gView.setAdapter(new dataAdapter(position));
changeIcon(position);
for (int i = 0; i < parent.getCount(); i++) {
if (position == i) {// 当前选中的item改变背景色
view.setBackgroundColor(Color.parseColor("#FFF8D7"));
} else {
// 获取未选中的item
View v = parent.getChildAt(i);
v.setBackgroundColor(Color.parseColor("#FFFFFF"));
}
}
}
经过测试,选中不同的item进行突现切换时,并没有去重绘GridView。希望有更好的方法的朋友能不吝留言,谢谢!