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);
}
}
}