需求是在listview展示的条目各个手机上显示效果一样,大分辨率手机和小分辨率显示条目个数是一致的,首先就是要获取屏幕的高度减去状态栏的高度减去标题栏的高度,以及标题分类的高度最后除以4来确定屏幕只显示4条数据。好了,先看图:
首先是XMl :
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" app:cardCornerRadius="@dimen/dp_10" app:cardElevation="@dimen/dp_1"> <RelativeLayout android:id="@+id/rl_image_bg" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/shape_fillet"> <RelativeLayout android:id="@+id/rl_nosettop" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:background="@drawable/shape_fillet"> <RelativeLayout android:id="@+id/rl_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginRight="@dimen/dp_10"> <ImageView android:id="@+id/iv_icon" android:layout_width="90dp" android:layout_height="90dp" android:scaleType="fitXY" android:src="@drawable/icon_default_banner" /> <LinearLayout android:layout_width="@dimen/dimen_30dp" android:layout_height="@dimen/dimen_40dp" android:background="@drawable/recommend_index" android:gravity="center_horizontal" android:orientation="vertical" android:paddingTop="@dimen/dp_5"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="推荐指数" android:textColor="@color/white" android:textSize="@dimen/sp_6" /> <TextView android:id="@+id/tv_recommend_index" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0.0" android:textColor="@color/white" android:textSize="@dimen/sp_15" android:textStyle="bold" /> </LinearLayout> </RelativeLayout> <RelativeLayout android:id="@+id/relativeLayout" android:layout_width="match_parent" android:layout_height="90dp" android:layout_centerVertical="true" android:layout_toRightOf="@id/rl_layout"> <TextView android:id="@+id/tv_adver_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="end" android:maxLines="2" android:text="标题" android:textColor="@color/tc_gray_3" android:textSize="@dimen/sp_13" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true"> <TextView android:id="@+id/tv_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:text="2018-01-01" android:textColor="@color/tc_gray" android:textSize="@dimen/sp_10" /> <TextView android:id="@+id/tv_source" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="@dimen/dp_8" android:layout_toRightOf="@id/tv_time" android:text="九悦4S店" android:textColor="@color/tc_gray" android:textSize="@dimen/sp_10" /> <ImageView android:id="@+id/iv_settop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="@dimen/dp_8" android:layout_toRightOf="@+id/tv_source" android:src="@drawable/img_set_top" android:visibility="gone" /> <TextView android:id="@+id/tv_num" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="@dimen/dimen_5dp" android:drawableLeft="@drawable/article_click_num" android:drawablePadding="@dimen/dp_5" android:text="0" android:textColor="@color/tc_gray" android:textSize="@dimen/sp_10" /> </RelativeLayout> </RelativeLayout> </RelativeLayout> </RelativeLayout> </android.support.v7.widget.CardView>
其次是Adapter,(因为我这个是Activity有Fragment,所以就不展示了,只展示Fragment的适配器):
package com.dyhoa.school.ui.director.adapter; import android.content.Context; import android.graphics.Color; import android.util.DisplayMetrics; import android.util.Log; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import com.dyh.common.utils.DisplayOption; import com.dyh.frame.simple.AbstractAdapter; import com.dyh.frame.util.DisplayUtil; import com.dyh.frame.util.ViewTools; import com.dyhoa.school.R; import com.dyhoa.school.ui.director.bean.BusinessMessageBean; import com.nineoldandroids.animation.ArgbEvaluator; import com.nineoldandroids.animation.ObjectAnimator; import com.nineoldandroids.animation.ValueAnimator; import com.nostra13.universalimageloader.core.ImageLoader; import java.util.List; /** * 商圈快讯列表适配器 */ public class BusinessMessageOneAdapter extends AbstractAdapter<BusinessMessageBean.Page> { public BusinessMessageOneAdapter(Context mContext, List<BusinessMessageBean.Page> dataList) { super(mContext, dataList); } @Override public int getListViewItemId() { return R.layout.item_business_message_one; } @Override public void convert(int position, View convertView, BusinessMessageBean.Page dataItem) { RelativeLayout rlImageBg = convertView.findViewById(R.id.rl_image_bg); RelativeLayout rLnosettop = convertView.findViewById(R.id.rl_nosettop); ImageView ivIcon = convertView.findViewById(R.id.iv_icon); ImageView ivSettop = convertView.findViewById(R.id.iv_settop); TextView tvRecommendIndex = convertView.findViewById(R.id.tv_recommend_index); TextView tvAdvert = convertView.findViewById(R.id.tv_adver_title); TextView tvTime = convertView.findViewById(R.id.tv_time); TextView tvSource = convertView.findViewById(R.id.tv_source); TextView tvNum = convertView.findViewById(R.id.tv_num); //获取宽高 DisplayMetrics dm = mContext.getResources().getDisplayMetrics(); int height = dm.heightPixels; //设置宽高 //附加注释,是我错误的原因,之前我的布局都是RelativeLayout,所以我都用的是RelativeLayout,然后就报错了,ClassCastException - 类型强制转换异常。然后看我的布局,是一个CardView----->RelativeLayout---->RelativeLayout,这是我的布局嵌套,因为Cardciew的父类继承自FrameLayout,所以就需要更改他的父类继承,DisplayUtil.dip2px(135)这个是我标题栏和标题分类的高度 FrameLayout.LayoutParams layoutParamsBg = (FrameLayout.LayoutParams) rlImageBg.getLayoutParams(); RelativeLayout.LayoutParams layoutParamsTop = (RelativeLayout.LayoutParams) rLnosettop.getLayoutParams(); layoutParamsBg.height = (height - DisplayUtil.dip2px(135) - ViewTools.getStatusBarHeight(mContext)) / 4; layoutParamsTop.height = (height - DisplayUtil.dip2px(135) - ViewTools.getStatusBarHeight(mContext)) / 4; rlImageBg.setLayoutParams(layoutParamsBg); rLnosettop.setLayoutParams(layoutParamsTop); if (dataItem.getIsTop() == 0) {//非置顶 ivSettop.setVisibility(View.GONE); rlImageBg.setPadding(0, 0, 0, 0); rLnosettop.setPadding(20, 20, 20, 20); } else if (dataItem.getIsTop() == 1) {//置顶 rlImageBg.setPadding(10, 10, 10, 10); rLnosettop.setPadding(20, 20, 20, 20); ivSettop.setVisibility(View.VISIBLE); ValueAnimator colorAnim = ObjectAnimator.ofInt(rlImageBg, "backgroundColor", Color.parseColor("#dcff1d"), Color.parseColor("#ee290f"), Color.parseColor("#0081ff")); colorAnim.setDuration(2000); colorAnim.setEvaluator(new ArgbEvaluator()); colorAnim.setRepeatCount(ValueAnimator.INFINITE); colorAnim.setRepeatMode(ValueAnimator.REVERSE); colorAnim.start(); } ImageLoader.getInstance().displayImage(dataItem.getIcon(), ivIcon, DisplayOption.getBannerOptions()); tvAdvert.setText(dataItem.getTitle()); tvTime.setText(dataItem.getAddtime1()); tvSource.setText(dataItem.getSource()); tvNum.setText(dataItem.getHits() > 100000 ? 100000 + "+" : dataItem.getHits() + ""); tvRecommendIndex.setText(dataItem.getLabDescp()); } }
最后补上我的公共类获取状态栏高度以及dp转换
public class DisplayUtil {
/** * 将dip或dp值转换为px值,保证尺寸大小不变 * * @param dipValue * @return pxValue */ public static int dip2px(float dipValue) { return (int) (dipValue * StaticFeild.density + 0.5f); } }
public class ViewTools { /** * 获取手机状态栏高度 * * @param context 上下文 */ public static int getStatusBarHeight(Context context){ Class<?> c = null; Object obj = null; Field field = null; int x = 0, statusBarHeight = 0; try { c = Class.forName("com.android.internal.R$dimen"); obj = c.newInstance(); field = c.getField("status_bar_height"); x = Integer.parseInt(field.get(obj).toString()); statusBarHeight = context.getResources().getDimensionPixelSize(x); } catch(Exception e1) { e1.printStackTrace(); } return statusBarHeight; }}