GridView的动态计算高度并设置分割线
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的列数设置为自动
2.android:columnWidth="90dp" //每列的宽度,也就是Item的宽度
3.android:stretchMode="columnWidth"//缩放与列宽大小同步
4.android:verticalSpacing="1dp"//两行之间的边距
5.android:horizontalSpacing="1dp" //两列之间的边距
6.android:cacheColorHint="#00000000" //去除拖动时默认的黑色背景
7.android:listSelector="#00000000" //去除选中时的黄色底色
8.android:scrollbars="none" //隐藏GridView的滚动条
9.android:fadeScrollbars="true" //设置为true就可以实现滚动条的自动隐藏和显示
10.android:fastScrollEnabled="true" //GridView出现快速滚动的按钮(至少滚动4页才会显示)
11.android:fadingEdge="none" //GridView衰落(褪去)边缘颜色为空,缺省值是vertical。(可以理解为上下边缘的提示色)
12.android:fadingEdgeLength="10dip" //定义的衰落(褪去)边缘的长度
13.android:stackFromBottom="true" //设置为true时,你做好的列表就会显示你列表的最下面
14.android:transcriptMode="alwaysScroll" //当你动态添加数据时,列表将自动往下滚动最新的条目可以自动滚动到可视范围内
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.返回个数整除行数。不够添加空的Entity对象,避免菜单个数不够背景为分割线的灰色。注意判断空指针
原理:自定义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;
}
/**
* 动态计算每个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);
//动态计算每个item的占剩下屏幕高度和宽度,GridView不能滚动,每行列数为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"//可设置为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>