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() 之前已經觸發。

還有其他的原因嗎?

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM