Android GridView 通过seletor 设置状态和默认状态
Android中可以通过selector控制GridView Item 的状态,而省去使用代码控制
GridView View Selector Xml文件
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 选择状态 --> <item android:drawable="@drawable/btn_big_normal_selected" android:state_selected="true" /> <!-- 默认状态 --> <item android:drawable="@drawable/btn_big_normal_disable"/> </selector>
GridView布局文件(这里的GridView是一个自定义的GridView,可以不用理会)
注意:不要在这里设置selector 【android:listSelector="@drawable/xxx"】
<com.yixin.nfyh.cloud.widget.GridView android:id="@+id/gv_setting_devices" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:cacheColorHint="@null" android:columnWidth="60dp" android:gravity="center" android:horizontalSpacing="5dp" android:numColumns="2" android:stretchMode="columnWidth" android:verticalSpacing="5dp" > </com.yixin.nfyh.cloud.widget.GridView>
这里有几个地方是需要注意的:
android:cacheColorHint="@null" -- 屏蔽点击的时候出现黑色的情况,也可以使用透明颜色@android:color/transparent
android:columnWidth="60dp" -- 每列宽度,需要设置 android:stretchMode="columnWidth"
android:verticalSpacing="5dp" -- 每列的垂直间隙
android:horizontalSpacing="5dp"-- 每列的水平间隙
GridView Item 布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:background="@drawable/btn_big_select" android:orientation="vertical" android:padding="30dp" > <ImageView android:id="@+id/img_view_device_logo" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_view_device_name" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
这里一定要注意的地方,就是背景:
android:background="@drawable/btn_big_select" -- 这里设置Selector,网上很多都是在GridView中设置,为什么不再GridView的设置呢?因为默认背景没有显示(求高手指导)。
最重要的是在Adapter中设置
gridview.requestFocusFromTouch(); //获取焦点
gridview.setSelection(position); //设置选择状态
@Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = getLayoutInflater().inflate( R.layout.view_device_item, null); } // 是否为默认选中项 if (isDefalutSelection()) { gridview.requestFocusFromTouch(); //获取焦点 gridview.setSelection(position); //设置选择状态 } return convertView; }
点击的时候可以更改为选择状态
@Override public void onItemClick(AdapterView<?> adapter, View v, int position, long arg3) { v.setSelected(true); }
总结
在adapter getView() 中设置 v.setSelected(true); 不起作用,而在点击的时候设置就有用?而一定要通过
gridview.setSelection(position);
这个是为啥?
我认为是当adapter初始化View之前已经设置select position ,通过onItemSelect 可以看到select 在 getView() 之前已经触发。
还有其他的原因吗?