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

    还有其他的原因吗?

  • 相关阅读:
    菜鸟系列docker——docker镜像下(5)
    菜鸟系列docker——docker镜像中(4)
    菜鸟系列docker——docker镜像上(3)
    菜鸟系列docker——docker仓库(2)
    菜鸟系列docker——docker基本概念(1)
    Postman工具内容梳理
    Fiddler抓包手机APP失败的处理
    微信
    微信文本的爬取
    如何写活类的装饰器
  • 原文地址:https://www.cnblogs.com/chenrui7/p/3682613.html
Copyright © 2011-2022 走看看