La serie RecyclerView (1) agrega vista de cabeza y cola

RecyclerView agrega vista de cabeza y cola

Imagen de efecto:

rv_haed_foot


principio:

1. Devuelve el número total de conjuntos de datos +2 en getItemCount () en el Adaptador.
2. Devuelva la vista de diseño de la cabeza y el pie en la primera y última posición en onCreateViewHolder en Adapter.


No hay mucho que decir, el código:

package adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.example.zpf.animmenu.R;

import java.util.ArrayList;

/**
 * 带有头部、尾部的RecyclerView的Adapter
 */

public class RvAdapterHeadFoot extends RecyclerView.Adapter<RvAdapterHeadFoot.HFViewHolder> {
    
    

    /**
     * 头部View类型
     */
    private final int TYPE_HEAD = 0;

    /**
     * 正常Item类型
     */
    private final int TYPE_ITEM = 1;

    /**
     * 尾部View类型
     */
    private final int TYPE_FOOT = -1;

    private Context mContext;
    private ArrayList<String> strings = new ArrayList<>();

    public RvAdapterHeadFoot(Context context) {

        this.mContext = context;
    }

    public void setModels(ArrayList<String> strings) {

        if (strings != null && !strings.isEmpty()) {

            this.strings = strings;
            notifyDataSetChanged();
        }
    }

    @Override
    public int getItemViewType(int position) {

        //根据position返回不同viewType,在onCreateViewHolder中初始化不同的布局
        if (position == 0)
            return TYPE_HEAD;
        else if (position == strings.size() + 1)
            return TYPE_FOOT;
        return TYPE_ITEM;
    }

    @Override
    public HFViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view;
        if (viewType == TYPE_HEAD)
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_head_rv, parent, false);
        else if (viewType == TYPE_FOOT)
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_foot_rv, parent, false);
        else
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_head_foot_rv, parent, false);
        return new HFViewHolder(view, viewType);
    }

    @Override
    public void onBindViewHolder(HFViewHolder holder, int position) {

        int viewType = getItemViewType(position);

        if (viewType == TYPE_HEAD) {

            //显示、控件操作可在这里处理,我这边直接return;
            return;
        }

        if (viewType == TYPE_FOOT) {

            //显示、控件操作可在这里处理,我这边直接return;
            return;
        }

        //这里positionModel是在数据集合ArrayList<String>中的真实position;
        int positionModel = position - 1;
        String url = strings.get(positionModel);

        Glide.with(mContext).load(url).thumbnail(0.1f).placeholder(R.mipmap.img_eig).into(holder.iv);
        holder.tv.setText(url);
    }

    @Override
    public int getItemCount() {
        //因为添加了Head_View、Foot_View所以这里+2
        return strings.size() + 2;
    }

    class HFViewHolder extends RecyclerView.ViewHolder {
    
    

        private ImageView iv;
        private TextView tv;

        HFViewHolder(View itemView, int viewType) {
            super(itemView);

            if (viewType == TYPE_FOOT || viewType == TYPE_HEAD) {

                //如果head/foot当中有控件的显示操作,可以在这里声明控件,我这里直接return;
                return;
            }
            iv = (ImageView) itemView.findViewById(R.id.iv_item_head_foot);
            tv = (TextView) itemView.findViewById(R.id.tv_item_head_foot);

        }
    }
}
El uso en Actividad es el mismo que el Adaptador normal
package com.example.zpf.animmenu;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import java.util.ArrayList;
import java.util.Arrays;

import adapter.RvAdapterHeadFoot;

public class RecyclerHeadFootActivity extends AppCompatActivity {
    
    

    private final String[] urls = {
            "http://hbimg.b0.upaiyun.com/6293fd60a2597a6017633e3c8e3816d89b70dc2165ad9-jkFvRh_fw658",
            "http://icon.nipic.com/BannerPic/20160426/photo/20160426160807.jpg",
            "http://icon.nipic.com/BannerPic/20160426/photo/20160426160826.jpg",
            "http://icon.nipic.com/BannerPic/20160426/photo/20160426160848.jpg",
            "http://icon.nipic.com/BannerPic/20160426/photo/20160426160908.jpg",
            "http://icon.nipic.com/BannerPic/20160426/photo/20160426160926.jpg",
            "http://pic94.nipic.com/file/20160409/11284670_185122899000_2.jpg",
            "http://pic94.nipic.com/file/20160403/22743169_220209251000_2.jpg",
            "http://pic94.nipic.com/file/20160410/18807750_102028863000_2.jpg",
            "http://pic94.nipic.com/file/20160406/22743169_234848884000_2.jpg",
            "http://pic94.nipic.com/file/20160406/19700831_040444643000_2.jpg",
            "http://pic94.nipic.com/file/20160321/7874840_094355922000_2.jpg",
            "http://pic94.nipic.com/file/20160406/22743169_233812263000_2.jpg",
            "http://pic94.nipic.com/file/20160407/21544848_224025191000_2.jpg"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycler_head_foot);

        initView();
    }

    private void initView() {

        RecyclerView rv = (RecyclerView) findViewById(R.id.rv_head_foot);
        rv.setLayoutManager(new LinearLayoutManager(this));
        rv.setHasFixedSize(true);

        ArrayList<String> strings = new ArrayList<>();
        strings.addAll(Arrays.asList(urls));

        RvAdapterHeadFoot adapter = new RvAdapterHeadFoot(this);
        adapter.setModels(strings);

        rv.setAdapter(adapter);
    }
}
Archivo de diseño de actividad xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.zpf.animmenu.RecyclerHeadFootActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_head_foot"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layoutAnimation="@anim/layout_vertical_enter"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>

</android.support.constraint.ConstraintLayout>
LayoutAnimation utilizado en el archivo de diseño anterior
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
    android:animationOrder="normal"
    android:delay="40%"
    android:animation="@anim/anim_room_notice_enter">

</layoutAnimation>
Archivo de diseño de cabezal utilizado en Adapter
<?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="wrap_content"
    android:gravity="center_horizontal"
    android:background="@color/colorBlack"
    android:orientation="vertical">

    <ImageView
        android:layout_width="120dp"
        android:layout_height="60dp"
        android:layout_marginTop="16dp"
        android:contentDescription="@null"
        android:scaleType="centerCrop"
        android:src="@mipmap/bg_width" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="24dp"
        android:gravity="center"
        android:text="黑色部分为head"
        android:textColor="@color/colorWhite"/>

</LinearLayout>
Archivo de diseño de pie
<?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="wrap_content"
    android:gravity="center"
    android:orientation="horizontal">

    <ProgressBar
        android:layout_width="24dp"
        android:layout_height="24dp"
        style="@style/Base.TextAppearance.AppCompat.Small.Inverse"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Foot布局"
        android:layout_margin="16dp"
        android:textSize="14sp"/>

    <ProgressBar
        android:layout_width="24dp"
        android:layout_height="24dp"
        style="@style/Base.TextAppearance.AppCompat.Small.Inverse"/>

</LinearLayout>
Archivo de diseño de elementos
<?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:contentPadding="8dp"
    app:cardElevation="2dp"
    app:cardUseCompatPadding="true">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/iv_item_head_foot"
            android:layout_width="56dp"
            android:layout_height="56dp"
            android:contentDescription="@null"
            android:src="@mipmap/ic_header"
            android:scaleType="centerCrop"/>

        <TextView
            android:id="@+id/tv_item_head_foot"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:textSize="14sp"
            android:lines="2"
            android:lineSpacingMultiplier="1.2"/>
    </LinearLayout>

</android.support.v7.widget.CardView>

Ok, aquí está el RecyclerView usando la serie (1) Agregar cabeza / pie y se acabó. En el próximo artículo, presentaré las tres pequeñas funciones de la actualización desplegable de RecyclerView, la carga de pull-up más y el evento de clic del elemento.


Eso es todo, si te interesa copia el código y pruébalo.

Supongo que te gusta

Origin blog.csdn.net/nsacer/article/details/72598569
Recomendado
Clasificación