默认first Item default selected
如果不手动 setSelecttion(int) 一个位置,gridview默认select first item
另外注意下文中的item selector 和元素selecor
item selector 指:item
元素 selector 指:item 上的 view 元素 比如TextView Buttom
UI效果上显示
1.1、item的selector
item默认first item selected 那么他的selector会成selected 状态,有时候并不想视图一加载这个效果就显示。可以通过 gridview.setFocusAble(false)来解决。
让gridview无法获取焦点那么 first item 的selected状态 还是被selected了,但是他的selecor不会显示
2、item内的元素的selector
元素的selector 无法通过改变gridview的focusAble 解决。
也就是说当gridview是focusAble = false,item的selector状态不会显示出来,但是元素的会显示出来。这个很麻烦
针对这种问题,如果要做到元素默认选中时不显示 element selector 那么就要在代码中思量,不要在xml里直接设置selectorDrawable
3、焦点离开gridview后清除item的selected状态(适用于内部的元素selected)
如果不进行处理,焦点离开gridview的时候 哪个item slected了还是selected的。这个是符合逻辑的,焦点离开后也可以通过读取gridView.getSelectedItemPosition()得到selected的位置
如果想焦点离开gridview 后item selected 状态清楚可以加上以下代码。
直接在gridview后加上 gridview .setSelection(-1); 不管是在 adapter.notifyDataSetChanged()前还是后,倒是没有效果的
```java
gridView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@SuppressLint("NewApi")
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
GridView gView = (GridView) v;
gView.setSelection(-1);
}
}
});
```
4、gridview focusAble 和 focusDisable 处理默认选中下 元素的selecor
4.1、focusDisAble的情况
gridview 的 onItemSelected(AdapterView
4.2、focusAble的情况
gridview 的 onItemSelected(AdapterView
4.3、解决
根据以上两种情况,解决方式如下:
首先xml里不直接设置slectorDrawable, 在代码中设置
focusAble的直接让focus 移动到别人身上,那么默认的选择一个item 就显示不出效果了,此情况的slected 状态还在,要想移除selected状态用 3、 中方法
focusDisable的 想了很久,其实也很简单,代码中判断下反正focus都disable了压根不能变化item选择直接把selectorDrawable设置成null 就成了。
ex:
mSeriesGridView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
// boolean oneShoot = isFirstCome;
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
//如果是focusAble的 进来不会默认onItemSelected 一次,focusDisable 的会默认进来一次
LogDebugUtil.i(TAG, " select = " + position);
if (!mSeriesGridView.isFocusable()) {
LogDebugUtil.i(TAG, "mSeriesGridView focable = false isFirstComeGridView == false");
view.findViewById(R.id.flag_iv).setBackgroundDrawable(null);
((TextView) view.findViewById(R.id.series_text)).setTextColor(
Color.parseColor("#a7cded"));
} else {
LogDebugUtil.i(TAG, "mSeriesGridView focable = true");
view.findViewById(R.id.flag_iv).setBackgroundResource(R.drawable.cltv_video_detail_current_bottom_selector);
TextViewUtil.setTextColorXmlDrawable(
(TextView) view.findViewById(R.id.series_text), getResources(), R.xml.cltv_video_detail_current_selector);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
ps:解决focusAble 元素select的另外一种方式
keyboardGridView.setOnFocusChangeListener(new OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
if (selectView != null) {
selectView.clearFocus();
TextView tv = (TextView) selectView.findViewById(R.id.episode);
tv.setTextColor(Color.WHITE);
tv.setBackgroundResource(R.drawable.key);
}
} else {
LoggerUtil.d(TAG, "position = " + keyboardGridView.getSelectedItemPosition());
if (selectView != null) {
TextView tv = (TextView) selectView.findViewById(R.id.episode);
if (tv.getTextColors() == TextViewUtil.getColorStateList(getResources(), R.xml.cltv_text_white_blue_selector)){
LogDebugUtil.d(TAG, "tv.getTextColors() == TextViewUtil.getColorStateList");
}else{
TextViewUtil.setTextColorXmlDrawable(tv, getResources(), R.xml.cltv_text_white_blue_selector);
tv.setBackgroundResource(R.drawable.keypad_selector);
}
}
}
}
});
keyboardGridView.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
//这里有个问题,first Default select的时候 arg0 = null
//所以第一次离开gridview的时候 default select item 的focus并不能被清
//但是先把 这个select落到别人那就可以了
selectView = arg1;
recordView = arg1;
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
4.4、补充
一个平时用的不多的select的配置在gridview的xml中
android:listSelector=”@drawable/tab_bottom_card_selector”