GridView的動態(tài)計算高度并設置分割線

1.GridView在xml中的常用屬性

 <GridView
        android:id="@+id/menu_gridview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="#e3e3e3"
        android:cacheColorHint="#00000000"
        android:gravity="center"
        android:horizontalSpacing="2dp"
        android:listSelector="#00000000"
        android:numColumns="4"
        android:scrollbars="none"
        android:verticalSpacing="0.5dp">
    </GridView>

2.GridView的常用屬性集合解釋

1.android:numColumns="auto_fit" //GridView的列數(shù)設置為自動
2.android:columnWidth="90dp" //每列的寬度,也就是Item的寬度
3.android:stretchMode="columnWidth"http://縮放與列寬大小同步
4.android:verticalSpacing="1dp"http://兩行之間的邊距
5.android:horizontalSpacing="1dp" //兩列之間的邊距
6.android:cacheColorHint="#00000000" //去除拖動時默認的黑色背景
7.android:listSelector="#00000000" //去除選中時的黃色底色
8.android:scrollbars="none" //隱藏GridView的滾動條
9.android:fadeScrollbars="true" //設置為true就可以實現(xiàn)滾動條的自動隱藏和顯示
10.android:fastScrollEnabled="true" //GridView出現(xiàn)快速滾動的按鈕(至少滾動4頁才會顯示)
11.android:fadingEdge="none" //GridView衰落(褪去)邊緣顏色為空,缺省值是vertical。(可以理解為上下邊緣的提示色)
12.android:fadingEdgeLength="10dip" //定義的衰落(褪去)邊緣的長度
13.android:stackFromBottom="true" //設置為true時,你做好的列表就會顯示你列表的最下面
14.android:transcriptMode="alwaysScroll" //當你動態(tài)添加數(shù)據(jù)時,列表將自動往下滾動最新的條目可以自動滾動到可視范圍內
15.android:drawSelectorOnTop="false" //點擊某條記錄不放,顏色會在記錄的后面成為背景色,內容的文字可見(缺省為false)

drawable的各個屬性

參考鏈接:(http://blog.csdn.net/czd3355/article/details/52691067
http://keeganlee.me/post/android/20150905

android:drawable 放一個drawable資源
android:state_pressed 是否按下,如一個按鈕觸摸或者點擊。
android:state_focused 是否取得焦點,比如用戶選擇了一個文本框。
android:state_hovered 光標是否懸停,通常與focused state相同,它是4.0的新特性
android:state_selected 被選中,它與focus state并不完全一樣,如一個list view 被選中的時候,它里面的各個子組件可能通過方向鍵,被選中了。
android:state_checkable 組件是否能被check。如:RadioButton是可以被check的。

android:state_checked 被checked了,如:一個RadioButton可以被check了。
android:state_enabled 能夠接受觸摸或者點擊事件
android:state_activated 被激活(這個麻煩舉個例子,不是特明白)
android:state_window_focused 應用程序是否在前臺,當有通知欄被拉下來或者一個對話框彈出的時候應用程序就不在前臺了

3.項目實際應用

場景:使用到GridView格式的菜單導航,需求加上分割線。
分析:
1.定義好GridView在xml中的常用屬性,并設置上背景色,作為分割線的顏色。
2.GridView的布局的item布局,可以設置一個自定義的selector的drawable文件,點擊的時候切換顏色顯示。
3.返回個數(shù)整除行數(shù)。不夠添加空的Entity對象,避免菜單個數(shù)不夠背景為分割線的灰色。注意判斷空指針

原理:自定義view幾個常見的需要注意的方法onMeasure() 、onDraw()、和onLayout()

  • onMeasure()方法中測量出自定義控件的寬和高并且調用
  • onLayout()方法來確定自定義控件在布局中的位置
  • onDraw()方法來將自定義 view 繪制在布局中
    所以在未能獲取某個view的控件寬高時需要measure一下測了出控件的寬高。

4.代碼

1.selector

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_selected="true" >
        <shape android:shape="rectangle">
            <solid
                android:color="#FFFFFF"
                />
        </shape>
    </item>
    <item
        android:state_pressed="true" >
        <shape android:shape="rectangle">
            <solid
                android:color="#FFFFFF"
                />
        </shape>
    </item>
    <item>
        <shape android:shape="rectangle">
            <solid
                android:color="#FFFFFF"
                />
        </shape>
    </item>
</selector>
      int i = menuGridList.size() % 4;
      if(i!=0){
                  for (int j = 0; j <4- i; j++) {
                   menuGridList.add(new MenuEntity());
              }
       }
      menuGridviewAdapter.notifyDataSetChanged();
package com.sinovatech.wanda.sg.business.basic.adapter;

import android.app.Activity;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.sinovatech.wanda.sg.App;
import com.sinovatech.wanda.sg.R;
import com.sinovatech.wanda.sg.business.basic.entity.MenuEntity;
import com.sinovatech.wanda.sg.business.basic.manager.HttpManager;
import com.sinovatech.wanda.sg.common.GlideApp;
import com.sinovatech.wanda.sg.common.UIUtils;

import java.util.List;


/**
 * Created by cheng.qx on 2018/3/6.
 */

public class MainMenuGridviewAdapter extends BaseAdapter {
    private Activity mContext;
    private LinearLayout mLinearLayout;
    private int measureHeight;

    private List<MenuEntity> menuList;

    public MainMenuGridviewAdapter(Activity context, List<MenuEntity> menuList) {
        this.mContext = context;
        this.menuList = menuList;
    }
   /**
     * 動態(tài)計算每個item的高度和寬度,GridView不能滾動
     * @param view
     */
    public void getMeasureLayoutHeight(LinearLayout view) {
        mLinearLayout = view;
        mLinearLayout.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
//        measureHeight=UIUtils.getScreenHeight(mContext)-mLinearLayout.getMeasuredHeight()-UIUtils.getStatusBarHeight(mContext);
        measureHeight = UIUtils.getScreenHeight(mContext) - mLinearLayout.getMeasuredHeight()  - 2;//多減去2像素的分割線,可去掉如果需求能滾動
    }

    @Override
    public int getCount() {
       return menuList.size() ;
    }

    @Override
    public Object getItem(int position) {
        return menuList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
       convertView = (LinearLayout) mContext.getLayoutInflater().inflate(R.layout.main_menu_item, null);
        //動態(tài)計算每個item的占剩下屏幕高度和寬度,GridView不能滾動,每行列數(shù)為4的情況下
       convertView.setLayoutParams(new AbsListView.LayoutParams(UIUtils.getScreenWidth(mContext) / 4,
                measureHeight*4 / (menuList.size() + menuList.size() % 4)));

        LinearLayout menuLayout = (LinearLayout) convertView.findViewById(R.id.home_menu_layout);
        TextView menuNameText = (TextView) convertView.findViewById(R.id.home_menu_name_text);
        ImageView menuImage = convertView.findViewById(R.id.home_menu_imageview);
        TextView menuCount = (TextView) convertView.findViewById(R.id.home_menu_notice_view);


        final MenuEntity entity = menuList.get(position);

        menuNameText.setText(entity.getMenuName());
        GlideApp.with(mContext)
                .load(HttpManager.ApplicationServer_BASE + entity.getMenuImgUrl())
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(menuImage);
        menuCount.setText(entity.getMenuCount());

        menuCount.setVisibility(View.INVISIBLE);
        if (!TextUtils.isEmpty(entity.getMenuCount()) && !"0".equals(entity.getMenuCount())) {
            menuCount.setVisibility(View.VISIBLE);
        } else {
            menuCount.setVisibility(View.INVISIBLE);
        }
        return convertView;
    }

}

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="match_parent"
    android:background="@color/color_white"http://可設置為selector中的drawable,存在點擊效果
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/home_menu_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1.0"
        android:clipChildren="false"
        android:gravity="center"
        android:orientation="vertical">

        <RelativeLayout
            android:layout_width="@dimen/new_home_menu_icon_wh"
            android:layout_height="@dimen/new_home_menu_icon_wh"
            android:layout_marginTop="6dp">

            <ImageView
                android:id="@+id/home_menu_imageview"
                android:layout_width="@dimen/new_home_menu_icon_wh"
                android:layout_height="@dimen/new_home_menu_icon_wh"
                android:scaleType="fitXY"
                android:src="@drawable/btn_09" />

            <TextView
                android:id="@+id/home_menu_notice_view"
                android:layout_width="20dp"
                android:layout_height="14dp"
                android:layout_alignParentRight="true"
                android:layout_alignParentTop="true"
                android:layout_marginRight="-16dp"
                android:layout_marginTop="-5dp"
                android:background="@drawable/bg_news"
                android:gravity="center"
                android:text=""
                android:textColor="#ffffff"
                android:textSize="11sp"
                android:visibility="invisible" />
        </RelativeLayout>

        <TextView
            android:id="@+id/home_menu_name_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="4dp"
            android:text="文本標題"
            android:textColor="#333333"
            android:textSize="@dimen/new_home_menu_textsize" />
    </LinearLayout>
</LinearLayout>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,777評論 25 709
  • afinalAfinal是一個android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,837評論 2 45
  • 報紙老去,文章字跡老去, 婚訊和訃告一一老去, 節(jié)日和災難日相繼老去, 有名和無名的性命攜手老去, 看報紙的人也漸...
    不落江南閱讀 423評論 0 0
  • Annie大講堂閱讀 196評論 0 0

友情鏈接更多精彩內容