RecyclerView最后一项显示不全的有效解决

普适性解决最后一项显示不全!

作者:FunnySaltyFish
RecyclerView 28

人类极度擅长创造替代关系,因为真实的关系充满了不可控的风险——《2030终点镇》

场景


自己写了一个小App,发布一段时间以后有用户反馈最后一项的卡片部分阴影被遮挡。于是试图解决。

  • 这是解决之前(图源酷安 @去春游の空心 反馈, 侵删)
  • 修复之前
  • 这是解决之后
  • 在这里插入图片描述
    那么效果很明显了,我们来看看过程。

探索


最初发现这个问题之后,我在CSDN上找了一圈,发现了很多解决方法,最常见的就是设置margin_bottom,还有其他乱七八糟的各种复制粘贴,毫无疑问,毛用没有!
然后就开始自己想思路,最后找到了一个比较普适的方法,在最后一項之后再多加一个Space控件。解决!

什么是Space?


由于不是本篇重点,简单来说,Space 是官方提供的,在android.widget包(和support库中)下的一个基本控件,目的就是为了留白。Space的独到之处就是其onDraw方法为空,这意味着它的绘制非常高效率,同时也意味着他无法使用setBackground等方法(因为根本就不绘制)。在这个场景中使用Space是个非常棒的选择。

话不多说,肝代码


  1. 新建一个ViewHolder用于盛放这个Space
private class SpaceViewHolder extends RecyclerView.ViewHolder{
		Space space;		
		public SpaceViewHolder(View view){			
			super(view);			
			space=view.findViewById(R.id.view_result_space_space);		
		}	
}

对应的xml
(此处写死了高度,因为需求上就只是为了阴影显示)

<Space xmlns:android="http://schemas.android.com/apk/res/android"
	android:id="@+id/view_result_space_space"
    android:layout_width="fill_parent"    
    android:layout_height="8dp">    
</Space>

2.重写对应RecyclerView的如下方法
●getItemCount,以实现多一項

@Override
public int getItemCount()	{		
	// TODO: Implement this method		
	return tasks==null?0:(tasks.size()+1);	
}

●getItemType,区分不同的vh

@Override
	public int getItemViewType(int position)	
	{		
		// TODO: Implement this method		
		if(position==tasks.size()){//最后一个Space		
			return 1;		
		}else{			
			return 0;		
		}	
	}

●onCreateViewHolder,实现按不同type创建不同vh

@Override
	public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int type)	{		
	// TODO: Implement this method		
	if(type==0){	//普通		
		View view=LayoutInflater.from(ctx).inflate(R.layout.view_result_content,parent,false);			
		ResultContentHolder holder=new ResultContentHolder(view);			
		return holder;		
	}else{			//Sapce 
		View view=LayoutInflater.from(ctx).inflate(R.layout.view_result_space,parent,false);			
		SpaceViewHolder holder=new SpaceViewHolder(view);			
		return holder;		
	}	
}

至此,解决!


我:github(是的没错,我是个菜鸡)

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值