GridView 焦点问题(listView 类似)

默认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”

你可能感兴趣的:(ListView,GridView,select,fisrt)