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() 之前已经触发。

还有其他的原因吗?

 

 

 

posted @ 2014-04-23 12:11  rae  阅读(6889)  评论(1编辑  收藏  举报