RecyclerView设置header(或者footer)/端部避免半月形阴影

来源:互联网 发布:淘宝流量和访客 编辑:程序博客网 时间:2024/06/14 02:22

端部避免半月形阴影

在android5.0当中正常的listview/scrollview在下拉的时候顶部会出现半月形的阴影效果,

先要去除这个小效果可以设置

android:overScrollMode=“never”

就可以去掉这些效果。这句是用来去掉系统自带的阴影

正常的listview/scrollview在进入和滑出控件边界的时候会出现一层虚化的效果:

为了去除虚化的效果可以使用

android:fadingEdge=“none”

这样就去掉了虚化的效果


header(或者footer)效果图

设置header需要以下3个步骤:

1、编写header.xml的布局

2、编写adapter

3、在MainActivity中实例化布局成View并把view传入到adapter


1、编写header.xml的布局

header.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="150dp">    <TextView        android:id="@+id/header"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:text="我是Header"        android:textSize="30sp"        android:textColor="#fde70b0b"        android:background="#f9777979"        android:gravity="center"/></LinearLayout>


2、编写adapter

FruitAdapter
public class FruitAdaptor extends RecyclerView.Adapter<FruitAdaptor.ViewHolder> {    private List<Fruit> fruits;    public static View header;    public static final int HEADER_NORMAL=0;    public static final int HEADER=1;    public static final int NORMAL=2;    public FruitAdaptor(List<Fruit> fruits) {        this.fruits = fruits;    }    /**     * 用于把header.xml初始化成view并传进来     * @param view     */    public void setHeader(View view){        this.header=view;        notifyItemInserted(0);  //以观察者的模式,如果调用此方法则把position=0的item占用    }    /**     * 如果设置footer,则用此方法     * @param view     */    public void setFooter(View view){        this.footer=view;        //以观察者的模式,如果调用此方法则把position=getItemCount()-1的item占用        notifyItemInserted(getItemCount()-1);    }    /**     * 得到每个item的类型     * 1、如果没有header,则返回NORMAL     * 2、如果有header,且position=0,则返回HEADER     *                  且position!=0,则返回HEADER_NORMAL     * @param position     * @return     */    @Override    public int getItemViewType(int position) {        if (header==null){            return NORMAL;        }else {            if (position==0){                return HEADER;            }else {                return HEADER_NORMAL;            }        }    }    /**     * 创建item中的viewholder     * 1、没有header或者有header但是不占用header位置的item正常返回viewholder     * 2、有header并且position=0的item返回装有header.xml的viewholder     * @param parent     * @param viewType     * @return     */    @Override    public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {        if (viewType==NORMAL||viewType==HEADER_NORMAL){            final View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit,parent,false);            final ViewHolder viewHolder=new ViewHolder(view);            return viewHolder;        }else {            return new ViewHolder(header);        }    }    /**     * 绑定每个item的数据     * 1、如果没有header(就是没有执行setHeader方法),则不执行notifyItemInserted(0)     * 2、与此相反,执行了notifyItemInserted(0)之后。position=0的item则装上了header.xml,     *    所以装数据的item的position从1开始(0被header占了)     * 3、如果有header并且position=0时,则立即返回,结束方法,因为header没有数据可以存取     * @param holder     * @param position     */    @Override    public void onBindViewHolder(ViewHolder holder, int position) {        if (getItemViewType(position)==NORMAL){            Fruit fruit=fruits.get(position);            holder.imageView.setImageResource(fruit.getImageId());            holder.textView.setText(fruit.getName());        }else if (getItemViewType(position)==HEADER){            return;        }else {            Fruit fruit=fruits.get(position-1); //有header的情况下position从1开始,所以position-1            holder.imageView.setImageResource(fruit.getImageId());            holder.textView.setText(fruit.getName());        }    }    /**     * 设置总的item数目     * 1、没有header为fruits.size()     * 2、有header再加一个header数目,即fruits.size()+1     * @return     */    @Override    public int getItemCount() {        if (header!=null){            return fruits.size()+1;        }        return fruits.size();    }    static class ViewHolder extends RecyclerView.ViewHolder{        View view;        ImageView imageView;        TextView textView;        /**         *viewholder的构造函数         * 1、如果传进来的view是header,则立即返回,结束此方法(因为header的布局与item其他的布局不同)         * 2、如果传进来的view不是header,则正常存取值         */        public ViewHolder(View view1){            super(view1);            if (view1==FruitAdaptor.header){                return;            }else {                view=view1;                imageView=(ImageView)view.findViewById(R.id.image_view);                textView=(TextView)view.findViewById(R.id.text_view);            }        }    }}

先设置setHeader方法传进来header的view,再重写getItemCount获取item的总数,重写getItemViewType得到有没有header和不同position的item类型,在重写onCreatViewHolder按类型把数据存进viewHolder(如果是header类型则利用viewHolder的构造方法不存进去数据),最后利用onBindViewHolder根据不同类型从viewHolder中获取数据(注意有header的情况则position-1)


3、在MainActivity中实例化布局成View并把view传入到adapter

MainActivity
public class MainActivity extends AppCompatActivity {    private List<Fruit> fruits=new ArrayList<Fruit>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initFruit();//模拟每个item中的数据        RecyclerView recyclerView=(RecyclerView)findViewById(R.id.recycler_view);        FruitAdapter fruitAdapter=new FruitAdapter(fruits);        final LinearLayoutManager linearLayoutManager=new LinearLayoutManager(MainActivity.this);        recyclerView.setLayoutManager(linearLayoutManager);        recyclerView.setAdapter(fruitAdapter);        //实例化header.xml并传入fruitAdapter        fruitAdapter.setHeader(LayoutInflater.from(this).inflate(R.layout.header,null));    }




footer与此同理。


原创粉丝点击