2.RecyclerView
跟ListView效果基本接近,但是性能,效果与灵活性比ListView强
它还可以横向滚动,能够显示列表,网格,瀑布流等形式,且不同的ViewHolder能够实现item多元化功能,但是使用起来稍微麻烦一点,没有类似ListView的onItemClickListener监听事件,需要开发者自己实现。
RecyclerView不能像ListView那样直接使用,因为他是新增的控件,得在project视图下的app文件夹下的build.gradle下导入依赖包
implementation 'androidx.recyclerview:recyclerview:1.1.0'

导包失败,加一行代码

首先在进行项目之前我们先写个菜单栏


<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <!--listView--> <item android:title="ListView效果" android:id="@+id/list_view"> <menu> <item android:title="垂直标准" android:id="@+id/list_view_vertical_stander"> </item> <item android:title="垂直反向" android:id="@+id/list_view_vertical_reverse"> </item> <item android:title="水平标准" android:id="@+id/list_view_horizontal_stander"> </item> <item android:title="水平反向" android:id="@+id/list_view_horizontal_reverse"> </item> </menu> </item> <!--网格效果--> <item android:title="GridView效果" android:id="@+id/Grid_view"> <menu> <item android:title="垂直标准" android:id="@+id/grid_view_vertical_stander"> </item> <item android:title="垂直反向" android:id="@+id/grid_view_vertical_reverse"> </item> <item android:title="水平标准" android:id="@+id/grid_view_horizontal_stander"> </item> <item android:title="水平反向" android:id="@+id/grid_view_horizontal_reverse"> </item> </menu> </item> <!--瀑布流--> <item android:title="StaggerView效果" android:id="@+id/stagger_view"> <menu> <item android:title="垂直标准" android:id="@+id/stagger_view_vertical_stander"> </item> <item android:title="垂直反向" android:id="@+id/stagger_view_vertical_reverse"> </item> <item android:title="水平标准" android:id="@+id/stagger_view_horizontal_stander"> </item> <item android:title="水平反向" android:id="@+id/stagger_view_horizontal_reverse"> </item> </menu> </item> </menu>
光写了菜单栏还不行,还显示不出来,那我们怎么让菜单栏显示出来呢??
//加载菜单 @Override public boolean onCreateOptionsMenu(Menu menu) {
//MenuInflater是用来实例化Menu目录下的Menu布局文件 getMenuInflater().inflate(R.menu.menu,menu); return super.onCreateOptionsMenu(menu); }
菜单出来了了,咋获取每个item以便后续给他们加上各自的状态?
//当菜单被选中 @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { int itemId = item.getItemId(); switch (itemId){ // list view case R.id.list_view_vertical_stander: Log.d(TAG,"点击了list_view_vertical_stander"); break; case R.id.list_view_vertical_reverse: Log.d(TAG,"点击了list_view_vertical_reverse"); break; case R.id.list_view_horizontal_stander: Log.d(TAG,"点击了list_view_horizontal_stander"); break; case R.id.list_view_horizontal_reverse: Log.d(TAG,"点击了list_view_horizontal_reverse"); break; // grid view case R.id.grid_view_vertical_stander: Log.d(TAG,"点击了grid_view_vertical_stander"); break; case R.id.grid_view_vertical_reverse: Log.d(TAG,"点击了grid_view_vertical_reverse"); break; case R.id.grid_view_horizontal_stander: Log.d(TAG,"点击了grid_view_horizontal_stander"); break; case R.id.grid_view_horizontal_reverse: Log.d(TAG,"点击了grid_view_horizontal_reverse"); break; // stagger view case R.id.stagger_view_vertical_stander: Log.d(TAG,"点击了stagger_view_vertical_stander"); break; case R.id.stagger_view_vertical_reverse: Log.d(TAG,"点击了stagger_view_vertical_reverse"); break; case R.id.stagger_view_horizontal_stander: Log.d(TAG,"点击了stagger_view_horizontal_stander"); break; case R.id.stagger_view_horizontal_reverse: Log.d(TAG,"点击了stagger_view_horizontal_reverse"); break; } return super.onOptionsItemSelected(item); }
现在我们的前期准备工作做好了
第一个界面我想写成左边图片右边文字那样的
先写个布局 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="90dp"> <ImageView android:id="@+id/list_view_icon" android:layout_width="70dp" android:layout_height="70dp" android:layout_margin="10dp" android:src="@drawable/ic_baseline_toys_24" android:scaleType="fitXY"/> <TextView android:id="@+id/list_view_title" android:textSize="40dp" android:text="小风车" android:layout_marginTop="20dp" android:layout_toRightOf="@id/list_view_icon" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout>
写RecyclerView activity_main.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=".MainActivity"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout>
MainActivity.class
package com.example.myrecyclerview; import android.annotation.SuppressLint; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.OrientationHelper; import androidx.recyclerview.widget.RecyclerView; import com.example.myrecyclerview.adapters.ListViewAdapter; import com.example.myrecyclerview.beans.Datas; import com.example.myrecyclerview.beans.ItemBean; import java.util.ArrayList; import java.util.List; /** * 总结: * 1、首先我们要有控件,这个RecyclerView它呢, * 添加RecyclerView的依赖,这样子才能在布局文件里使用RecyclerView这个控件。 * 2、通过findViewById找到控件 * 3、准备好数据 * 4、设置布局管理器 * 5、创建适配器 * 6、设置适配器 * 7、数据就可以现实出来了 */ public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; RecyclerView recyclerView; LinearLayoutManager linearLayoutManager; //假数据 List<ItemBean> mData; @SuppressLint("WrongConstant") @Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); super.onCreate(savedInstanceState); //找到recyclerview recyclerView = (RecyclerView)this.findViewById(R.id.recycler_view); //RecyclerView需要设置样式(布局) linearLayoutManager = new LinearLayoutManager(this); linearLayoutManager.setOrientation(OrientationHelper.VERTICAL); recyclerView.setLayoutManager(linearLayoutManager); //准备数据 模拟一些假数据 initData(); } //加载菜单 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu,menu); return super.onCreateOptionsMenu(menu); } //当菜单被选中 @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { int itemId = item.getItemId(); switch (itemId){ // list view case R.id.list_view_vertical_stander: Log.d(TAG,"点击了list_view_vertical_stander"); break; case R.id.list_view_vertical_reverse: Log.d(TAG,"点击了list_view_vertical_reverse"); break; case R.id.list_view_horizontal_stander: Log.d(TAG,"点击了list_view_horizontal_stander"); break; case R.id.list_view_horizontal_reverse: Log.d(TAG,"点击了list_view_horizontal_reverse"); break; // grid view case R.id.grid_view_vertical_stander: Log.d(TAG,"点击了grid_view_vertical_stander"); break; case R.id.grid_view_vertical_reverse: Log.d(TAG,"点击了grid_view_vertical_reverse"); break; case R.id.grid_view_horizontal_stander: Log.d(TAG,"点击了grid_view_horizontal_stander"); break; case R.id.grid_view_horizontal_reverse: Log.d(TAG,"点击了grid_view_horizontal_reverse"); break; // stagger view case R.id.stagger_view_vertical_stander: Log.d(TAG,"点击了stagger_view_vertical_stander"); break; case R.id.stagger_view_vertical_reverse: Log.d(TAG,"点击了stagger_view_vertical_reverse"); break; case R.id.stagger_view_horizontal_stander: Log.d(TAG,"点击了stagger_view_horizontal_stander"); break; case R.id.stagger_view_horizontal_reverse: Log.d(TAG,"点击了stagger_view_horizontal_reverse"); break; } return super.onOptionsItemSelected(item); } //生成假数据的函数 private void initData(){ //弄些假数据----->Adapter适配器----->显示数据 //创建集合 mData = new ArrayList<>(); //创建模拟数据 for (int i = 0; i < 10; i++) { mData.add(new ItemBean(Datas.icons[i], "小风车"+i)); } //创建适配器 并把数据给适配器 ListViewAdapter listViewAdapter = new ListViewAdapter(mData); //设置适配器到RecyclerView里去 recyclerView.setAdapter(listViewAdapter); } }
ItemBean.class
package com.example.myrecyclerview.beans; public class ItemBean { public int icon; public String title; public ItemBean(int icon, String title) { this.icon = icon; this.title = title; } }
Datas.class
package com.example.myrecyclerview.beans; import com.example.myrecyclerview.R; public class Datas { public static int[] icons = { R.drawable.ic_baseline_toys_24, R.drawable.ic_favorite_black_24dp, R.drawable.ic_baseline_toys_24, R.drawable.ic_favorite_black_24dp, R.drawable.ic_baseline_toys_24, R.drawable.ic_favorite_black_24dp, R.drawable.ic_baseline_toys_24, R.drawable.ic_favorite_black_24dp, R.drawable.ic_baseline_toys_24, R.drawable.ic_favorite_black_24dp}; }
ListenrViewAdapter.xml
package com.example.myrecyclerview.adapters; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.example.myrecyclerview.R; import com.example.myrecyclerview.beans.ItemBean; import java.util.List; //继承RecyclerView.Adapter适配器之后,先写泛型,写完泛型直接全部快捷生成就ok了 public class ListViewAdapter extends RecyclerView.Adapter<ListViewAdapter.InnerHolder> { private final List<ItemBean> mData; //自己写构造方法 public ListViewAdapter(List<ItemBean> data){ this.mData = data; } //这个方法用于创建条目的View(条目的界面) @NonNull @Override public InnerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { //创建能承载这个条目数据的界面(新建一个layout) View view = View.inflate(parent.getContext(), R.layout.item_list_view, null); return new InnerHolder(view); } //这个方法用于绑定内部holder @Override public void onBindViewHolder(@NonNull InnerHolder holder, int position) { //设置数据,这个函数没有,自己设置 holder.setData(mData.get(position)); } //返回条目的个数 @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); //找到条目控件 mTitle = itemView.findViewById(R.id.list_view_title); mIcon = itemView.findViewById(R.id.list_view_icon); } public void setData(ItemBean itemBean) { //开始设置数据 mIcon.setImageResource(itemBean.icon); mTitle.setText(itemBean.title); } } }

实现ListView的效果

MainActivity.xml
package com.example.myrecyclerview; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.OrientationHelper; import androidx.recyclerview.widget.RecyclerView; import android.annotation.SuppressLint; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import com.example.myrecyclerview.adapters.ListViewAdapter; import com.example.myrecyclerview.beans.Datas; import com.example.myrecyclerview.beans.ItemBean; import java.util.ArrayList; import java.util.List; /** * 总结: * 1、首先我们要有控件,这个RecyclerView它呢是在V7包下的,所以我们要打开这个 Module settings里的依赖, * 添加RecyclerView的依赖,这样子才能在布局文件里使用RecyclerView这个控件。 * 2、通过findViewById找到控件 * 3、准备好数据 * 4、设置布局管理器 * 5、就是创建适配器 * 6、设置适配器 * 7、数据就可以现实出来了 */ public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; RecyclerView recyclerView; LinearLayoutManager linearLayoutManager; //假数据 List<ItemBean> mData; @SuppressLint("WrongConstant") @Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); super.onCreate(savedInstanceState); //找到recyclerview recyclerView = (RecyclerView)this.findViewById(R.id.recycler_view); //默认ListView效果 showList(true,true); //准备数据 模拟一些假数据 initData(); } //加载菜单 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu,menu); return super.onCreateOptionsMenu(menu); } //当菜单被选中 @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { int itemId = item.getItemId(); switch (itemId){ // list view case R.id.list_view_vertical_stander: showList(true,false); Log.d(TAG,"点击了list_view_vertical_stander"); break; case R.id.list_view_vertical_reverse: Log.d(TAG,"点击了list_view_vertical_reverse"); showList(true,true); break; case R.id.list_view_horizontal_stander: Log.d(TAG,"点击了list_view_horizontal_stander"); showList(false,false); break; case R.id.list_view_horizontal_reverse: Log.d(TAG,"点击了list_view_horizontal_reverse"); showList(false,true); break; // grid view case R.id.grid_view_vertical_stander: Log.d(TAG,"点击了grid_view_vertical_stander"); break; case R.id.grid_view_vertical_reverse: Log.d(TAG,"点击了grid_view_vertical_reverse"); break; case R.id.grid_view_horizontal_stander: Log.d(TAG,"点击了grid_view_horizontal_stander"); break; case R.id.grid_view_horizontal_reverse: Log.d(TAG,"点击了grid_view_horizontal_reverse"); break; // stagger view case R.id.stagger_view_vertical_stander: Log.d(TAG,"点击了stagger_view_vertical_stander"); break; case R.id.stagger_view_vertical_reverse: Log.d(TAG,"点击了stagger_view_vertical_reverse"); break; case R.id.stagger_view_horizontal_stander: Log.d(TAG,"点击了stagger_view_horizontal_stander"); break; case R.id.stagger_view_horizontal_reverse: Log.d(TAG,"点击了stagger_view_horizontal_reverse"); break; } return super.onOptionsItemSelected(item); } //生成假数据的函数 private void initData(){ //弄些假数据----->Adapter适配器----->显示数据 //创建集合 mData = new ArrayList<>(); //创建模拟数据 for (int i = 0; i < 10; i++) { mData.add(new ItemBean(Datas.icons[i], "小风车"+i)); } //创建适配器 ListViewAdapter listViewAdapter = new ListViewAdapter(mData); //设置适配器到RecyclerView里去 recyclerView.setAdapter(listViewAdapter); } //用于显示ListView @SuppressLint("WrongConstant") public void showList(boolean isVertical,boolean isReverse){ //通过布局管理器来控制 //设置水平还是垂直? //设置正向还是反向? //RecyclerView需要设置样式(布局) linearLayoutManager = new LinearLayoutManager(this); linearLayoutManager.setOrientation(isVertical ? OrientationHelper.VERTICAL : OrientationHelper.HORIZONTAL); linearLayoutManager.setReverseLayout(isReverse); recyclerView.setLayoutManager(linearLayoutManager); } }
现在我们想实现分割线,谷歌14年开发者大会发布了一个控件CardView
implementation 'androidx.cardview:cardview:1.0.0'
把我们的图片和图片后面的文字用cardView包裹起来
<?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"> <!--cardUseCompatPadding是自动调整适合的间距--> <androidx.cardview.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" app:cardBackgroundColor="#FFFFFF" app:cardUseCompatPadding="true"> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:id="@+id/list_view_icon" android:layout_width="70dp" android:layout_height="70dp" android:layout_margin="10dp" android:src="@drawable/ic_baseline_toys_24" android:scaleType="fitXY"/> <TextView android:id="@+id/list_view_title" android:textSize="40dp" android:text="小风车" android:layout_marginTop="20dp" android:layout_toRightOf="@id/list_view_icon" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </androidx.cardview.widget.CardView> </RelativeLayout>
现在我们去实现GridView效果
首先就是创建一个布局
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:orientation="vertical"> <androidx.cardview.widget.CardView android:layout_width="wrap_content" android:layout_height="wrap_content" app:cardUseCompatPadding="true"> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:id="@+id/grid_view_icon" android:layout_width="80dp" android:layout_height="80dp" android:src="@drawable/ic_baseline_toys_24" android:scaleType="fitXY" android:layout_centerHorizontal="true"/> <TextView android:id="@+id/grid_view_textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="我是一个标题" android:textSize="25sp" android:layout_marginTop="20dp" android:layout_below="@id/grid_view_icon"/> </RelativeLayout> </androidx.cardview.widget.CardView> </RelativeLayout>
MainActivity.class
//用于显示GridView @SuppressLint("WrongConstant") public void showGrid(boolean isVertical,boolean isReverse){ //通过布局管理器来控制 //设置水平还是垂直? //设置正向还是反向? //RecyclerView需要设置样式(布局) //列数是两列 gridLayoutManager = new GridLayoutManager(this,3); gridLayoutManager.setOrientation(isVertical ? OrientationHelper.VERTICAL : OrientationHelper.HORIZONTAL); gridLayoutManager.setReverseLayout(isReverse); //设置布局管理器 recyclerView.setLayoutManager(gridLayoutManager); //把数据传给适配器 GridViewAdapter gridViewAdapter = new GridViewAdapter(mData); recyclerView.setAdapter(gridViewAdapter); }
GridViewAdapter.class 适配器
package com.example.myrecyclerview.adapters; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.example.myrecyclerview.R; import com.example.myrecyclerview.beans.ItemBean; import java.util.ArrayList; import java.util.List; public class GridViewAdapter extends RecyclerView.Adapter<GridViewAdapter.InnerHolder> { List<ItemBean> itemBeanList = new ArrayList<>(); ImageView imageView; TextView textView; //先通过构造方法把数据传进来啊 public GridViewAdapter(List<ItemBean> itemBeanList){ this.itemBeanList = itemBeanList; } //绑定这条item的ui @NonNull @Override public GridViewAdapter.InnerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View inflate = View.inflate(parent.getContext(), R.layout.item_grid_view, null); return new InnerHolder(inflate); } //绑定数据 @Override public void onBindViewHolder(@NonNull GridViewAdapter.InnerHolder holder, int position) { holder.setData(itemBeanList.get(position)); } @Override public int getItemCount() { //返回条数 if (itemBeanList != null){ return itemBeanList.size(); } return 0; } //找到控件 public class InnerHolder extends RecyclerView.ViewHolder { public InnerHolder(@NonNull View itemView) { super(itemView); textView = itemView.findViewById(R.id.grid_view_textview); imageView = itemView.findViewById(R.id.grid_view_icon); } //找到控件之后设置数据 public void setData(ItemBean itemBean) { textView.setText(itemBean.title); imageView.setImageResource(itemBean.icon); } } }
实现瀑布流的效果
main
//用于显示Stagger 瀑布流效果 @SuppressLint("WrongConstant") public void showtagger(boolean isVertical,boolean isReverse){ //通过布局管理器来控制 //设置水平还是垂直? //设置正向还是反向? //RecyclerView需要设置样式(布局) //列数 方向 staggerManger = new StaggeredGridLayoutManager(2,isVertical?StaggeredGridLayoutManager.VERTICAL:StaggeredGridLayoutManager.HORIZONTAL); staggerManger.setReverseLayout(isReverse); //设置布局管理器 recyclerView.setLayoutManager(staggerManger); //把数据传给适配器 StaggerViewAdapter staggerViewAdapter = new StaggerViewAdapter(mData); recyclerView.setAdapter(staggerViewAdapter); }
item_statter_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"> <androidx.cardview.widget.CardView android:layout_width="wrap_content" android:layout_height="wrap_content" app:cardUseCompatPadding="true"> <ImageView android:id="@+id/stagger_view_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:adjustViewBounds="true" android:src="@drawable/ic_baseline_toys_24" /> <TextView android:id="@+id/stagger_view_textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/stagger_view_icon" android:layout_marginTop="9dp" android:text="我是一个标题" android:textSize="25sp" /> </androidx.cardview.widget.CardView> </RelativeLayout>
StaggerViewAdapter.class
package com.example.myrecyclerview.adapters; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.example.myrecyclerview.R; import com.example.myrecyclerview.beans.ItemBean; import java.util.ArrayList; import java.util.List; public class StaggerViewAdapter extends RecyclerView.Adapter<StaggerViewAdapter.InnerHolder> { List<ItemBean> itemBeanList = new ArrayList<>(); TextView textView; ImageView imageView; public StaggerViewAdapter(List<ItemBean> mData) { this.itemBeanList = mData; } @NonNull @Override public StaggerViewAdapter.InnerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View inflate = View.inflate(parent.getContext(), R.layout.item_stagger_view, null); return new InnerHolder(inflate); } @Override public void onBindViewHolder(@NonNull StaggerViewAdapter.InnerHolder holder, int position) { holder.setData(itemBeanList.get(position)); } @Override public int getItemCount() { if (itemBeanList != null){ return itemBeanList.size(); } return 0; } public class InnerHolder extends RecyclerView.ViewHolder { public InnerHolder(@NonNull View itemView) { super(itemView); //找到控件 textView = itemView.findViewById(R.id.stagger_view_textview); imageView = itemView.findViewById(R.id.stagger_view_icon); } public void setData(ItemBean itemBean) { textView.setText(itemBean.title); imageView.setImageResource(itemBean.icon); } } }
接下来要完成条目的点击事件 不使用回调函数
ListViewAdapter.class
package com.example.myrecyclerview.adapters; import android.annotation.SuppressLint; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.example.myrecyclerview.R; import com.example.myrecyclerview.beans.ItemBean; import java.util.List; //继承RecyclerView.Adapter适配器之后,先写泛型,写完泛型直接全部快捷生成就ok了 public class ListViewAdapter extends RecyclerView.Adapter<ListViewAdapter.InnerHolder> { private final List<ItemBean> mData; //自己写构造方法 public ListViewAdapter(List<ItemBean> data){ this.mData = data; } //创建布局,创建viewHolder实例并返回 //这个方法用于创建条目的View(条目的界面) @NonNull @Override public InnerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { //创建能承载这个条目数据的界面(新建一个layout) View view = View.inflate(parent.getContext(), R.layout.item_list_view, null); return new InnerHolder(view); } //对RecyclerView的子项赋值,并设置其他属性 //这个方法用于绑定内部holder @Override public void onBindViewHolder(@NonNull InnerHolder holder, @SuppressLint("RecyclerView") int position) { //设置数据,这个函数没有,自己设置 holder.setData(mData.get(position),position); //所有点击事件都由InnerHolder(ViewHolder)获取 holder.mIcon.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(view.getContext(), "点击了图片 id:"+position,Toast.LENGTH_SHORT).show(); Log.e("点击了图片: id: : ", String.valueOf(position)); } }); holder.mTitle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(view.getContext(), "点击了文字 id:"+position,Toast.LENGTH_SHORT).show(); Log.e("点击了文字: id: : ", String.valueOf(position)); } }); } //返回条目的个数 @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); //找到条目控件 mTitle = itemView.findViewById(R.id.list_view_title); mIcon = itemView.findViewById(R.id.list_view_icon); } public void setData(ItemBean itemBean,int position) { //开始设置数据 mTitle.setText(itemBean.title); mIcon.setImageResource(itemBean.icon); } } }
StaggerViewAdapter.class
package com.example.myrecyclerview.adapters; import android.annotation.SuppressLint; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.example.myrecyclerview.R; import com.example.myrecyclerview.beans.ItemBean; import java.util.ArrayList; import java.util.List; public class StaggerViewAdapter extends RecyclerView.Adapter<StaggerViewAdapter.InnerHolder> { List<ItemBean> itemBeanList = new ArrayList<>(); TextView textView; ImageView imageView; public StaggerViewAdapter(List<ItemBean> mData) { this.itemBeanList = mData; } @NonNull @Override public StaggerViewAdapter.InnerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View inflate = View.inflate(parent.getContext(), R.layout.item_stagger_view, null); return new InnerHolder(inflate); } @Override public void onBindViewHolder(@NonNull StaggerViewAdapter.InnerHolder holder, @SuppressLint("RecyclerView") int position) { holder.setData(itemBeanList.get(position)); //图片id的获取 holder.itemView.findViewById(R.id.stagger_view_icon).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(view.getContext(), "点击了图片 id:"+position,Toast.LENGTH_SHORT).show(); Log.e("点击了图片: id: : ", String.valueOf(position)); } }); //文字id的获取 holder.itemView.findViewById(R.id.stagger_view_textview).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(view.getContext(), "点击了文字 id:"+position,Toast.LENGTH_SHORT).show(); Log.e("点击了文字: id: : ", String.valueOf(position)); } }); } @Override public int getItemCount() { if (itemBeanList != null){ return itemBeanList.size(); } return 0; } public class InnerHolder extends RecyclerView.ViewHolder { public InnerHolder(@NonNull View itemView) { super(itemView); //找到控件 textView = itemView.findViewById(R.id.stagger_view_textview); imageView = itemView.findViewById(R.id.stagger_view_icon); } public void setData(ItemBean itemBean) { textView.setText(itemBean.title); imageView.setImageResource(itemBean.icon); } } }
GridViewAdapter.class
package com.example.myrecyclerview.adapters; import android.annotation.SuppressLint; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.example.myrecyclerview.R; import com.example.myrecyclerview.beans.ItemBean; import java.util.ArrayList; import java.util.List; public class GridViewAdapter extends RecyclerView.Adapter<GridViewAdapter.InnerHolder> { List<ItemBean> itemBeanList = new ArrayList<>(); ImageView imageView; TextView textView; //先通过构造方法把数据传进来啊 public GridViewAdapter(List<ItemBean> itemBeanList){ this.itemBeanList = itemBeanList; } //绑定这条item的ui @NonNull @Override public GridViewAdapter.InnerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View inflate = View.inflate(parent.getContext(), R.layout.item_grid_view, null); return new InnerHolder(inflate); } //绑定数据 @Override public void onBindViewHolder(@NonNull GridViewAdapter.InnerHolder holder, @SuppressLint("RecyclerView") int position) { holder.setData(itemBeanList.get(position)); //图片id的获取 holder.itemView.findViewById(R.id.grid_view_icon).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(view.getContext(), "点击了图片 id:"+position,Toast.LENGTH_SHORT).show(); Log.e("点击了图片: id: : ", String.valueOf(position)); } }); //文字id的获取 holder.itemView.findViewById(R.id.grid_view_textview).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(view.getContext(), "点击了文字 id:"+position,Toast.LENGTH_SHORT).show(); Log.e("点击了文字: id: : ", String.valueOf(position)); } }); } @Override public int getItemCount() { //返回条数 if (itemBeanList != null){ return itemBeanList.size(); } return 0; } //找到控件 public class InnerHolder extends RecyclerView.ViewHolder { public InnerHolder(@NonNull View itemView) { super(itemView); textView = itemView.findViewById(R.id.grid_view_textview); imageView = itemView.findViewById(R.id.grid_view_icon); } //找到控件之后设置数据 public void setData(ItemBean itemBean) { textView.setText(itemBean.title); imageView.setImageResource(itemBean.icon); } } }

浙公网安备 33010602011771号