普适性解决最后一项显示不全!
作者:FunnySaltyFish
RecyclerView 28
人类极度擅长创造替代关系,因为真实的关系充满了不可控的风险——《2030终点镇》
场景
自己写了一个小App,发布一段时间以后有用户反馈最后一项的卡片部分阴影被遮挡。于是试图解决。
- 这是解决之前(图源酷安 @去春游の空心 反馈, 侵删)
- 
- 这是解决之后
- 
那么效果很明显了,我们来看看过程。
探索
最初发现这个问题之后,我在CSDN上找了一圈,发现了很多解决方法,最常见的就是设置margin_bottom,还有其他乱七八糟的各种复制粘贴,毫无疑问,毛用没有!
然后就开始自己想思路,最后找到了一个比较普适的方法,在最后一項之后再多加一个Space控件。解决!
什么是Space?
由于不是本篇重点,简单来说,Space 是官方提供的,在android.widget包(和support库中)下的一个基本控件,目的就是为了留白。Space的独到之处就是其onDraw方法为空,这意味着它的绘制非常高效率,同时也意味着他无法使用setBackground等方法(因为根本就不绘制)。在这个场景中使用Space是个非常棒的选择。
话不多说,肝代码
- 新建一个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(是的没错,我是个菜鸡)