RecyclerView

1.首先在gradle中導(dǎo)入一些必要配置

implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.github.bumptech.glide:glide:4.3.1'
//圖片異步加載
annotationProcessor 'com.github.bumptech.glide:compiler:4.3.1'
implementation 'com.android.support:cardview-v7:28.0.0'

2.布局:

2.1:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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=".MainActivity">

  <!--下拉刷新控件-->
  <android.support.v4.widget.SwipeRefreshLayout
    android:layout_width="match_parent"
    android:id="@+id/refresh_layout"
    android:layout_height="match_parent">

      <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#D3D3D3" />
  </android.support.v4.widget.SwipeRefreshLayout>
</LinearLayout>

2.2:activity_multy_type.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".MultyTypeActivity">

 <android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
</RelativeLayout>

2.3:item_grid_view.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

  <android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    app:cardUseCompatPadding="true">
      <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center">
          <ImageView
            android:id="@+id/icon"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:src="@drawable/pic_01"
            android:scaleType="centerCrop"/>
          <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="我是標(biāo)題"
            android:layout_below="@+id/icon"
            android:padding="5dp"/>
      </RelativeLayout>
  </android.support.v7.widget.CardView>
</RelativeLayout>

2.4:item_list_load_more.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:orientation="vertical">

  <android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="match_parent">

      <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <!--這部分是加載的部分,一個圈圈和title-->

          <LinearLayout
            android:id="@+id/loading"
            android:layout_width="match_parent"
            android:layout_height="90dp"
            android:gravity="center_vertical">

              <ProgressBar
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:padding="20dp" />

              <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="正在玩命加載更多..."
                android:textSize="25sp" />

          </LinearLayout>

          <TextView
            android:id="@+id/reload"
            android:layout_width="match_parent"
            android:layout_height="90dp"
            android:gravity="center"
            android:text="加載失敗,請點(diǎn)擊重新加載"
            android:textSize="25sp" />

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

2.5:item_list_view.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:padding="10dp">

  <android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardUseCompatPadding="false"
    android:background="#fff">

      <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

          <ImageView
            android:id="@+id/icon"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:scaleType="centerCrop"
            android:src="@drawable/pic_01" />

          <TextView
            android:id="@+id/title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/icon"
            android:layout_centerVertical="true"
            android:padding="10dp"
            android:text="第一張"
            android:textSize="20sp" />
      </RelativeLayout>
  </android.support.v7.widget.CardView>
</RelativeLayout>

2.6:item_stagger_view.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="match_parent">

  <android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#fff"
    app:cardUseCompatPadding="true">

      <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

          <ImageView
            android:id="@+id/icon"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:adjustViewBounds="true"
            android:scaleType="fitCenter"
            android:src="@drawable/pic_01" />

          <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/icon"
            android:layout_centerHorizontal="true"
            android:layout_margin="20dp"
            android:text="我是標(biāo)題"
            android:textSize="20sp" />
      </RelativeLayout>
  </android.support.v7.widget.CardView>
</RelativeLayout>

2.7:item_type_full_image.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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">

  <android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:elevation="3dp"
    app:cardUseCompatPadding="true">

      <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

          <TextView
            android:id="@+id/type_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:text="我是標(biāo)題一"
            android:textSize="30sp" />

          <ImageView
            android:id="@+id/type_image"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:layout_below="@+id/type_title"
            android:layout_marginTop="10dp"
            android:scaleType="centerCrop"
            android:src="@drawable/pic_01" />
      </RelativeLayout>
  </android.support.v7.widget.CardView>
</RelativeLayout>

2.8: item_type_right_image.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
  android:padding="10dp">

  <android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:elevation="3dp"
    app:cardUseCompatPadding="true">

      <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

          <TextView
            android:id="@+id/type_title"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="2"
            android:text="我是標(biāo)題二,略略略l啦啦啦啦啦啦啦啦啦啦略略略略略略略略略略"
            android:textSize="20sp" />

          <ImageView
            android:id="@+id/type_image"
            android:layout_width="0dp"
            android:layout_height="100dp"
            android:layout_marginLeft="20dp"
            android:layout_weight="1"
            android:scaleType="fitStart"
            android:src="@drawable/pic_01" />
      </LinearLayout>
  </android.support.v7.widget.CardView>
</LinearLayout>

2.9:item_type_three_image.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
  android:orientation="vertical"
  android:padding="10dp">

  <android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:elevation="3dp"
    app:cardUseCompatPadding="true">

      <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

          <TextView
            android:id="@+id/type_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="我是標(biāo)題三"
            android:textSize="20sp" />

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

              <ImageView
                android:id="@+id/type_image"
                android:layout_width="0dp"
                android:layout_height="100dp"
                android:layout_margin="2dp"
                android:layout_weight="1"
                android:scaleType="centerCrop"
                android:src="@drawable/pic_01" />

              <ImageView
                android:id="@+id/type_image2"
                android:layout_width="0dp"
                android:layout_height="100dp"
                android:layout_margin="2dp"
                android:layout_weight="1"
                android:scaleType="centerCrop"
                android:src="@drawable/pic_02" />

              <ImageView
                android:id="@+id/type_image3"
                android:layout_width="0dp"
                android:layout_height="100dp"
                android:layout_margin="2dp"
                android:layout_weight="1"
                android:scaleType="centerCrop"
                android:src="@drawable/pic_03" />
          </LinearLayout>
      </LinearLayout>
  </android.support.v7.widget.CardView>
</LinearLayout>

3.資源文件:res/menu/menu.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:title="ListView效果" android:id="@+id/list_view">
        <menu>
            <item android:title="垂直標(biāo)準(zhǔn)" android:id="@+id/list_view_vertical_stander"/>
            <item android:title="垂直反向" android:id="@+id/list_view_vertical_reverse"/>
            <item android:title="水平標(biāo)準(zhǔn)" android:id="@+id/list_view_horizontal_stander"/>
            <item android:title="水平反向" android:id="@+id/list_view_horizontal_reverse"/>
        </menu>
    </item>
    <item android:title="GridView效果" android:id="@+id/grid_view">
        <menu>
            <item android:title="垂直標(biāo)準(zhǔn)" android:id="@+id/grid_view_vertical_stander"/>
            <item android:title="垂直反向" android:id="@+id/grid_view_vertical_reverse"/>
            <item android:title="水平標(biāo)準(zhǔn)" android:id="@+id/grid_view_horizontal_stander"/>
            <item android:title="水平反向" android:id="@+id/grid_view_horizontal_reverse"/>
        </menu>
    </item>
    <item android:title="瀑布流效果" android:id="@+id/stagger_view">
        <menu>
            <item android:title="垂直標(biāo)準(zhǔn)" android:id="@+id/stagger_view_vertical_stander"/>
            <item android:title="垂直反向" android:id="@+id/stagger_view_vertical_reverse"/>
            <item android:title="水平標(biāo)準(zhǔn)" android:id="@+id/stagger_view_horizontal_stander"/>
            <item android:title="水平反向" android:id="@+id/stagger_view_horizontal_reverse"/>
        </menu>
    </item>
    <item android:title="多種條目類型" android:id="@+id/multy_type"/>

</menu>

4.主頁面代碼

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    private RecyclerView mList;
    private List<ItemBean> mData;
    private RecyclerViewBaseAdapter mAdapter;
    private SwipeRefreshLayout mRefreshLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mList = findViewById(R.id.recycler_view);
        mRefreshLayout = findViewById(R.id.refresh_layout);
        //準(zhǔn)備數(shù)據(jù)
        /*
         **準(zhǔn)備數(shù)據(jù)买羞,一般來說藤乙,我們在現(xiàn)實(shí)開發(fā)中突雪,我們的數(shù)據(jù)是從網(wǎng)絡(luò)中獲取的,這里面只是演示重虑。
         *所以我們只是模擬數(shù)據(jù)蝇裤,在現(xiàn)實(shí)開發(fā)中也是要模擬數(shù)據(jù)的廷支,比如說,后臺沒有準(zhǔn)備好的時候。
         */
        initData();
        //設(shè)置默認(rèn)樣式為ListView效果
        showList(true,false);

        //處理下拉刷新
        handlerDownPullUpdate();

   }

    private void handlerDownPullUpdate() {
        mRefreshLayout.setColorSchemeResources(R.color.colorPrimary,R.color.colorAccent,R.color.colorPrimaryDark);
        mRefreshLayout.setEnabled(true);
        mRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                //刷新數(shù)據(jù)操作

                /**
                 * 當(dāng)我們在頂部栓辜,下拉的時候,這個方法就會被觸發(fā)
                 * 但是恋拍,這個方法是MainThread是主線程,不可以執(zhí)行耗時操作藕甩。
                 * 一般來說施敢,我們?nèi)フ埱髷?shù)據(jù)在開一個線程去獲取
                 * 這里面演示的話,我直接添加一條數(shù)據(jù)
                 */

                //添加數(shù)據(jù)
                ItemBean data = new ItemBean();
                data.title = "我是新添加的數(shù)據(jù)...";
                data.icon = R.drawable.pic_06;
                mData.add(0, data);
                //更新UI
               new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        //這里要做兩件事,一件是讓刷新停止,另外一件則是要更新列表
                        mAdapter.notifyDataSetChanged();
                        mRefreshLayout.setRefreshing(false);
                    }
                },3000);
            }
        });
    }

    private void initListener() {
        mAdapter.setOnItemClickListener(new RecyclerViewBaseAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                Toast.makeText(MainActivity.this,"點(diǎn)擊了第"+(position+1)+ "個條目",Toast.LENGTH_SHORT).show();
            }
        });

        //這里面去出發(fā)上拉加載更多
        if (mAdapter instanceof ListViewAdapter) {
            ((ListViewAdapter) mAdapter).setOnRefreshLayout(new ListViewAdapter.OnRefreshListener() {
                @Override
                public void OnUpPullRefresh(final ListViewAdapter.LoaderMoreHolder loaderMoreHolder) {
                    //這里面去加載更多的數(shù)據(jù),同樣,需要在子線程中完成,這里僅作演示

                   //更新UI
                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            Random random = new Random();
                            if (random.nextInt() % 2 ==0) {
                                //添加數(shù)據(jù)
                                ItemBean data = new ItemBean();
                                data.title = "我是新添加的數(shù)據(jù)...";
                                data.icon = R.drawable.pic_08;
                                mData.add(data);

                                //這里要做兩件事,一件是讓刷新停止辛萍,另外一件則是要更新列表
                                mAdapter.notifyDataSetChanged();
                                loaderMoreHolder.update(loaderMoreHolder.LOADER_STATE_NORMAL);
                            }else{
                                loaderMoreHolder.update(loaderMoreHolder.LOADER_STATE_RELOAD);
                            }


                        }
                    },3000);

                }
            });
        }
    }

    private void initData() {
        //List<DataBean>---->Adapter----->setAdapter-------->顯示數(shù)據(jù)
        //創(chuàng)建數(shù)據(jù)集合
        mData = new ArrayList<>();

        //創(chuàng)建模擬數(shù)據(jù)
        for (int i = 0; i < Datas.icons.length; i++) {
            //創(chuàng)建數(shù)據(jù)對象
            ItemBean data = new ItemBean();
            data.icon = Datas.icons[i];
            data.title = "第 "+ (i+1) +" 個條目";
            //將數(shù)據(jù)添加到集合里面
            mData.add(data);
        }


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int itemId = item.getItemId();
        switch (itemId) {

            //ListView部分
            case R.id.list_view_vertical_stander:
                Log.d(TAG, "點(diǎn)擊了ListView里面的垂直標(biāo)準(zhǔn)");
                showList(true,false);
                break;
            case R.id.list_view_vertical_reverse:
                Log.d(TAG, "點(diǎn)擊了ListView里面的垂直反向");
                showList(true,true);
                break;
            case R.id.list_view_horizontal_stander:
                showList(false,false);
                break;
            case R.id.list_view_horizontal_reverse:
                showList(false,true);
                break;

            //GridView部分
            case R.id.grid_view_vertical_stander:
                showGrid(true,false);
                break;
            case R.id.grid_view_vertical_reverse:
                showGrid(true,true);
                break;
            case R.id.grid_view_horizontal_stander:
                showGrid(false,false);
                break;
            case R.id.grid_view_horizontal_reverse:
                showGrid(false,true);
                break;

            //瀑布流部分
            case R.id.stagger_view_vertical_stander:
                showStagger(true,false);
                break;
            case R.id.stagger_view_vertical_reverse:
                showStagger(true,true);
                break;
            case R.id.stagger_view_horizontal_stander:
                showStagger(false,false);
                break;
            case R.id.stagger_view_horizontal_reverse:
                showStagger(false,true);
                break;
                //多種條目類型
            case R.id.multy_type:
                startActivity(new Intent(MainActivity.this,MultyTypeActivity.class));
                break;

        }
        return super.onOptionsItemSelected(item);
    }

    private void showStagger(boolean isVertical,boolean isReverse) {
        StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, isVertical ? StaggeredGridLayoutManager.VERTICAL : StaggeredGridLayoutManager.HORIZONTAL);
        layoutManager.setReverseLayout(isReverse);

        mList.setLayoutManager(layoutManager);
        //創(chuàng)建適配器
        mAdapter = new StaggerAdapter(mData);
        //設(shè)置適配器
        mList.setAdapter(mAdapter);

        //初始化事件
        initListener();
    }

    private void showGrid(boolean isVertical,boolean isReverse) {
        GridLayoutManager layoutManager = new GridLayoutManager(this, 2 );
        //設(shè)置水平還是垂直
        layoutManager.setOrientation(isVertical ? GridLayoutManager.VERTICAL : GridLayoutManager.HORIZONTAL);
        //設(shè)置標(biāo)準(zhǔn)(正向)還是反向的
        layoutManager.setReverseLayout(isReverse);

        mList.setLayoutManager(layoutManager);
        //創(chuàng)建適配器
        mAdapter = new GridViewAdapter(mData);
        mList.setAdapter(mAdapter);

        //初始化事件
        initListener();
    }

    //用于顯示ListView一樣的效果
    private void showList(boolean isVertical,boolean isReverse) {
        //RecyclerView需要設(shè)置樣式,其實(shí)就是設(shè)置布局管理器
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        //設(shè)置布局管理器來控制
        //設(shè)置水平還是垂直
        layoutManager.setOrientation(isVertical ? LinearLayoutManager.VERTICAL : LinearLayoutManager.HORIZONTAL);
        //設(shè)置標(biāo)準(zhǔn)(正向)還是反向的
        layoutManager.setReverseLayout(isReverse);

        mList.setLayoutManager(layoutManager);

        //創(chuàng)建適配器
        mAdapter = new ListViewAdapter(mData);
        //設(shè)置到RecyclerView里面去
        mList.setAdapter(mAdapter);

        //初始化事件
        initListener();
    }
}

5.Bean類:

5.1:Datas

public class Datas {
    public static int[] icons = {
        R.drawable.pic_01,
        R.drawable.pic_02,
        R.drawable.pic_03,
        R.drawable.pic_04,
        R.drawable.pic_05,
        R.drawable.pic_06,
        R.drawable.pic_07,
        R.drawable.pic_08,
        R.drawable.pic_09,
        R.drawable.pic_10,
        R.drawable.pic_11,
        R.drawable.pic_12
    };
}

5.2:ItemBean

public class ItemBean {
    public int icon;
    public String title;
}

5.3:MultyTypeBean

public class MultyTypeBean {
    public int type;
    public int pic;
}

6.Recyclerview的各種Adapter:

公共:

//public abstract class RecyclerViewBaseAdapter extends RecyclerView.Adapter<RecyclerViewBaseAdapter.InnerHolder> {
public abstract class RecyclerViewBaseAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
//    private final List<ItemBean> mData;
    protected final List<ItemBean> mData;
    private OnItemClickListener mOnItemClickListener;

    public RecyclerViewBaseAdapter(List<ItemBean> data) {
        this.mData = data;
    }
    @NonNull
    @Override
//    public RecyclerViewBaseAdapter.InnerHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = getSubView(viewGroup,i);
        return new InnerHolder(view);
    }

    protected abstract View getSubView(ViewGroup viewGroup, int i);

    @Override
//    public void onBindViewHolder(@NonNull RecyclerViewBaseAdapter.InnerHolder innerHolder, int i) {
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder innerHolder, int i) {
//        innerHolder.setData(mData.get(i),i);
        ((InnerHolder) innerHolder).setData(mData.get(i),i);
    }

    @Override
    public int getItemCount() {
        if (mData != null) {
            return mData.size();
        }
        return 0;
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        //設(shè)置一個監(jiān)聽悯姊,其實(shí)羡藐,就是要設(shè)置一個接口贩毕,一個回調(diào)的接口
        this.mOnItemClickListener = listener;

    }

    /**
     * 編寫回調(diào)的步驟
     * 1、創(chuàng)建這個接口
     * 2仆嗦、定義借口內(nèi)部的方法
     * 3辉阶、提供設(shè)置接口的方法(其實(shí)是外部實(shí)現(xiàn))
     * 4、接口方法的調(diào)用
     */
    public interface OnItemClickListener{
        void onItemClick(int position);
    }


    public class InnerHolder extends RecyclerView.ViewHolder {
        private ImageView mIcon;
        private TextView mTitle;
        private int mPosition;

        public InnerHolder(@NonNull View itemView) {
            super(itemView);
            mIcon = itemView.findViewById(R.id.icon);
            mTitle = itemView.findViewById(R.id.title);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mOnItemClickListener != null) {
                        mOnItemClickListener.onItemClick(mPosition);
                    }
                }
            });
        }

        public void setData(ItemBean itemBean,int position) {
            this.mPosition = position;
            Glide.with(mIcon.getContext()).load(itemBean.icon).into(mIcon);
            mTitle.setText(itemBean.title);
        }
    }
}

6.1:ListViewAdapter

public class ListViewAdapter extends RecyclerViewBaseAdapter {

    //普通的條目類型
    private static final int TYPE_NORMAL = 0;
    //加載更多
    private static final int TYPE_LOADER_MORE = 1;
    private OnRefreshListener mOnRefreshListener;

    public ListViewAdapter(List<ItemBean> data) {
        super(data);
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = getSubView(viewGroup, i);
        if (i == TYPE_NORMAL) {
            return new InnerHolder(view);
        } else {
            return new LoaderMoreHolder(view);
        }
    }


    @Override
    protected View getSubView(ViewGroup viewGroup, int i) {
        View view;
        //根據(jù)類型創(chuàng)建view
        if (i == TYPE_NORMAL) {
            view = View.inflate(viewGroup.getContext(), R.layout.item_list_view, null);
        } else {
            //這個是加載更多的
            view = View.inflate(viewGroup.getContext(), R.layout.item_list_load_more, null);
        }

        return view;
    }

    //新增
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder innerHolder, int i) {
        if (getItemViewType(i) == TYPE_NORMAL && innerHolder instanceof InnerHolder) {
            ((InnerHolder) innerHolder).setData(mData.get(i), i);
        } else if (getItemViewType(i) == TYPE_LOADER_MORE && innerHolder instanceof LoaderMoreHolder) {
            ((LoaderMoreHolder) innerHolder).update(LoaderMoreHolder.LOADER_STATE_LOADING);
        }
    }


    @Override
    public int getItemViewType(int position) {
        if (position == getItemCount() - 1) {
            //最后一個則返回加載更多
            return TYPE_LOADER_MORE;
        } else
            return TYPE_NORMAL;
    }

    //設(shè)置刷新的監(jiān)聽接口
    public void setOnRefreshLayout(OnRefreshListener onRefreshListener) {
        this.mOnRefreshListener = onRefreshListener;
    }

    //定義接口
    public interface OnRefreshListener {
        void OnUpPullRefresh(LoaderMoreHolder loaderMoreHolder);
    }

    public class LoaderMoreHolder extends RecyclerView.ViewHolder {

        public static final int LOADER_STATE_LOADING = 0;
        public static final int LOADER_STATE_RELOAD = 1;
        public static final int LOADER_STATE_NORMAL = 2;

        private TextView mReload;
        private LinearLayout mLoading;

        public LoaderMoreHolder(@NonNull View itemView) {
            super(itemView);
            mLoading = itemView.findViewById(R.id.loading);
            mReload = itemView.findViewById(R.id.reload);

            mReload.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //觸發(fā)加載數(shù)據(jù)
//                    startLoadMore();
                    update(LOADER_STATE_LOADING);
                }
            });
        }

        public void update(int state) {

            //重置控件的狀態(tài)
            mLoading.setVisibility(View.GONE);
            mReload.setVisibility(View.GONE);

            switch (state) {
                case LOADER_STATE_LOADING:
                    mLoading.setVisibility(View.VISIBLE);
                    //觸發(fā)加載數(shù)據(jù)
                    startLoadMore();
                    break;

                case LOADER_STATE_RELOAD:
                    mReload.setVisibility(View.VISIBLE);
                    break;

                case LOADER_STATE_NORMAL:
                    mLoading.setVisibility(View.GONE);
                    mReload.setVisibility(View.GONE);
                    break;
            }
        }

        private void startLoadMore() {
            if (mOnRefreshListener != null) {
                mOnRefreshListener.OnUpPullRefresh(this);
            }
        }
    }
}

6.2:GridViewAdapter

/*
public class GridViewAdapter extends RecyclerView.Adapter<GridViewAdapter.InnerHolder> {

    private final List<ItemBean> mData;

    public GridViewAdapter(List<ItemBean> data){
        this.mData = data;
    }
    @NonNull
    @Override
    public InnerHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = (View) LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_grid_view, null);
        return new InnerHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull InnerHolder innerHolder, int i) {
        innerHolder.setData(mData.get(i));
    }

    @Override
    public int getItemCount() {
        if (mData != null) {
            return mData.size();
        }
        return 0;
    }

    public class InnerHolder extends RecyclerView.ViewHolder {

        private ImageView mIcon;
        private TextView mTitle;

        public InnerHolder(@NonNull View itemView) {
            super(itemView);
            mIcon = itemView.findViewById(R.id.icon);
            mTitle = itemView.findViewById(R.id.title);
        }

        public void setData(ItemBean itemBean) {
            Glide.with(mIcon.getContext()).load(itemBean.icon).into(mIcon);
            mTitle.setText(itemBean.title);
        }
    }
}
*/

public class GridViewAdapter extends RecyclerViewBaseAdapter{

    public GridViewAdapter(List<ItemBean> data) {
        super(data);
    }

    @Override
    protected View getSubView(ViewGroup viewGroup, int i) {
        View view = View.inflate(viewGroup.getContext(), R.layout.item_grid_view, null);
        return view;
    }
}

6.3:StaggerAdapter

public class StaggerAdapter extends RecyclerViewBaseAdapter {
    public StaggerAdapter(List<ItemBean> data) {
        super(data);
    }

    @Override
    protected View getSubView(ViewGroup viewGroup, int i) {
        View view = View.inflate(viewGroup.getContext(), R.layout.item_stagger_view,null);
        return view;
    }
}

6.4:MultyTypeActivity

public class MultyTypeActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private List<MultyTypeBean> mData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_multy_type);
        mRecyclerView = findViewById(R.id.recycler_view);

        //準(zhǔn)備數(shù)據(jù)
        mData = new ArrayList<>();

        initDatas();

        //創(chuàng)建和設(shè)置布局管理器
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(layoutManager);

        //創(chuàng)建適配器
        MultyTypeAdapter adapter = new MultyTypeAdapter(mData);

        //設(shè)置適配器
        mRecyclerView.setAdapter(adapter);


    }

    private void initDatas() {
        Random random = new Random();

        for (int i = 0; i < Datas.icons.length; i++) {
            MultyTypeBean data = new MultyTypeBean();
            data.pic = Datas.icons[i];
            data.type = random.nextInt(3);
            mData.add(data);
        }
    }
}

6.4.1:MultyTypeAdapter

public class MultyTypeAdapter extends RecyclerView.Adapter {
    //定義三個常量標(biāo)識瘩扼,因?yàn)槲胰N類
    public static final int TYPE_FULL_IMAGE = 0;
    public static final int TYPE_RIGHT_IMAGE = 1;
    public static final int TYPE_THREE_IMAGE = 2;

    private final List<MultyTypeBean> mData;

    public MultyTypeAdapter(List<MultyTypeBean> data) {
        this.mData = data;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view;

        //TODD:創(chuàng)建ViewHolder
        if (i == TYPE_FULL_IMAGE) {
            view = View.inflate(viewGroup.getContext(), R.layout.item_type_full_image, null);
            return new FullImageHolder(view);
        } else if (i == TYPE_RIGHT_IMAGE) {
            view = View.inflate(viewGroup.getContext(), R.layout.item_type_right_image, null);
            return new RightImageHolder(view);
        } else {
            view = View.inflate(viewGroup.getContext(), R.layout.item_type_three_image, null);
            return new ThreeImageHolder(view);
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {

    }

    @Override
    public int getItemCount() {
        if (mData != null) {
            return mData.size();
        }
        return 0;
    }

    //我們要復(fù)寫一個方法,這個方法是根據(jù)條件來返條目類型的


    @Override
    public int getItemViewType(int position) {
        MultyTypeBean multyTypeBean = mData.get(position);
        if (multyTypeBean.type == 0) {
            return TYPE_FULL_IMAGE;
        } else if (multyTypeBean.type == 1) {
            return TYPE_RIGHT_IMAGE;
        } else {
            return TYPE_THREE_IMAGE;
        }
    }

    private class FullImageHolder extends RecyclerView.ViewHolder {
        public FullImageHolder(@NonNull View itemView) {
            super(itemView);
        }
    }

    private class RightImageHolder extends RecyclerView.ViewHolder {
        public RightImageHolder(@NonNull View itemView) {
            super(itemView);
        }
    }

    private class ThreeImageHolder extends RecyclerView.ViewHolder {
        public ThreeImageHolder(@NonNull View itemView) {
            super(itemView);
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谆甜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子集绰,更是在濱河造成了極大的恐慌规辱,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栽燕,死亡現(xiàn)場離奇詭異罕袋,居然都是意外死亡改淑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門浴讯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朵夏,“玉大人,你說我怎么就攤上這事榆纽⊙霾” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵奈籽,是天一觀的道長饥侵。 經(jīng)常有香客問我,道長衣屏,這世上最難降的妖魔是什么爆捞? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮勾拉,結(jié)果婚禮上煮甥,老公的妹妹穿的比我還像新娘。我一直安慰自己藕赞,他們只是感情好成肘,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著斧蜕,像睡著了一般双霍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上批销,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天洒闸,我揣著相機(jī)與錄音,去河邊找鬼均芽。 笑死丘逸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的掀宋。 我是一名探鬼主播深纲,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼劲妙!你這毒婦竟也來了湃鹊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤镣奋,失蹤者是張志新(化名)和其女友劉穎币呵,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侨颈,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡余赢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年掸驱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片没佑。...
    茶點(diǎn)故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡毕贼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛤奢,到底是詐尸還是另有隱情鬼癣,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布啤贩,位于F島的核電站待秃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏痹屹。R本人自食惡果不足惜章郁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望志衍。 院中可真熱鬧暖庄,春花似錦、人聲如沸楼肪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽春叫。三九已至肩钠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間暂殖,已是汗流浹背价匠。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呛每,地道東北人踩窖。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像莉给,于是被迫代替她去往敵國和親毙石。 傳聞我的和親對象是個殘疾皇子廉沮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容