zoukankan      html  css  js  c++  java
  • 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() 之前已经触发。

    还有其他的原因吗?

  • 相关阅读:
    Nginx 部署多个 web 项目(虚拟主机)
    Nginx 配置文件
    Linux 安装 nginx
    Linux 安装 tomcat
    Linux 安装 Mysql 5.7.23
    Linux 安装 jdk8
    Linux 安装 lrzsz,使用 rz、sz 上传下载文件
    springMVC 拦截器
    spring 事务
    基于Aspectj 注解实现 spring AOP
  • 原文地址:https://www.cnblogs.com/chenrui7/p/3682613.html
Copyright © 2011-2022 走看看