使用GridView时想实现点击其中的一个Item,该Item改变背景,再次点击Item变回原来的背景,网上搜了很多资料都没有看到类似的案例,但还是有所启发,现来分享我的做法。
首先,首先为GridView自定义adapter适配器,继承BaseAdapter类。
实现效果的重要因素如下,为item设置一个标记点击状态的数组。
public class gridAdapter extends BaseAdapter { final itemLength = 16; private LayoutInflater layoutInflater; private List<String> gridDataList = new ArrayList<>(); private int clickTemp = -1;//标识被选择的item private int[] clickedList=new int[itemLength];//这个数组用来存放item的点击状态 private Context c; gridAdapter(Context context){ c = context; layoutInflater = LayoutInflater.from(context); for (int i =0;i<itemLength;i++){ clickedList[i]=0; //初始化item点击状态的数组 } } ---------- 以下代码省略 ---------- }
然后在定义的adapter中写一个方法,用于识别当前被选择的item
public void setSeclection(int posiTion) { clickTemp = posiTion; }
在setOnItemClickListener中.将点击的Item位置通过setSeclection( )传到adapter。
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { gridadapter.setSeclection(position); gridadapter.notifyDataSetChanged(); } });
接下来adapter中很重要的重载方法getView()。
@Override public View getView(int position, View convertView, ViewGroup parent) { //..................代码省略 if(clickTemp==position){ //根据点击的Item当前状态设置背景 if (clickedList[position]==0){ convertView.setBackgroundColor(Color.BLUE); clickedList[position]=1; } else { convertView.setBackgroundColor(Color.TRANSPARENT); clickedList[position]=0; } } //..................代码省略 }
提醒:不要忘了notifyDataSetChanged(),否则点击效果不会显示。
在修改适配器绑定的数据后,利用notifyDataSetChanged()刷新Item。