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() 之前已經觸發。
還有其他的原因嗎?