1.首先在app中的build.gradle添加
//有些人不需要添加也可以用
implementation 'androidx.recyclerview:recyclerview:1.0.0'
XML
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:orientation="vertical"
>
<Button
android:id="@+id/bnt1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加数据"
android:onClick="onClick"
/>
<Button
android:id="@+id/bnt2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="切换布局"
android:onClick="onClick"
/>
<Button
android:id="@+id/bnt3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="插入数据"
android:onClick="onClick"
/>
<Button
android:id="@+id/bnt4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="删除数据"
android:onClick="onClick"
/>
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recycler_view"
>
</androidx.recyclerview.widget.RecyclerView>
</LinearLayout>
2.item_layout.xml
<?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:orientation="horizontal"
android:background="#A4D3EE"
android:layout_margin="4dp">
<ImageView
android:id="@+id/iv"
android:layout_width="88dp"
android:layout_height="88dp"
android:scaleType="fitXY"/>
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="22sp"
android:textColor="#fff"
android:gravity="center_vertical"
android:layout_marginLeft="8dp"/>
</LinearLayout>
主代码
1.RecyAdapter适配器
- 1.继承RecyclerView.Adapter
- 2.绑定ViewHolder
- 3.实现Adapter的相关方法
public class RecyAdapter extends RecyclerView.Adapter<RecyAdapter.MyViewHolder> {
private Context mcontext;
private List<String> dataSource;
private RecyclerView mRyw;
private OnItemList onItemList;
private int addDataPosition = -1;
//重写
public RecyAdapter(Context context,RecyclerView recyclerView){
this.mcontext = context;
this.dataSource = new ArrayList<>();
this.mRyw = recyclerView;
}
//set方法
public void setDataSource(List<String> dataSource){
this.dataSource = dataSource;
notifyDataSetChanged();
}
public void setOnItemList(OnItemList onItemList) {
this.onItemList = onItemList;
}
@NonNull
@Override
//创建并且返回ViewHolder
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new MyViewHolder(LayoutInflater.from(mcontext).inflate(R.layout.item_layout,parent,false));
}
//接收MyViewHolder实例,通过ViewHolder绑定数据
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {
holder.mimg.setImageResource(getImg(position));
holder.mtxt.setText(dataSource.get(position));
//瀑布流使用随机高度
if (mRyw.getLayoutManager().getClass() == StaggeredGridLayoutManager.class){
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
getRdmHeight());
holder.mtxt.setLayoutParams(params);
}else {
//不是瀑布流
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
holder.mtxt.setLayoutParams(params);
}
//改变背景颜色
if (addDataPosition == position){
holder.mitemView.setBackgroundColor(Color.RED);
}
holder.mitemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//调用接口
if (onItemList != null){
onItemList.OnTiemClick(position);
}
}
});
}
@Override
//返回数据数量
public int getItemCount() {
return dataSource.size();
}
//图片这里可以自己准备
private int getImg (int img){
switch (img % 5){
case 0:
return R.mipmap.a;
case 1:
return R.mipmap.b;
case 2:
return R.mipmap.c;
case 3:
return R.mipmap.d;
case 4:
return R.mipmap.e;
}
return 0;
}
private int getRdmHeight(){
return (int)(Math.random () *1000);
}
//添加
public void addData(int position){
addDataPosition = position;
dataSource.add(position,"插入数据");
notifyItemInserted(position);
notifyItemRangeChanged(position,dataSource.size() - position);
}
//删除
public void removerData(int position){
addDataPosition = -1;
dataSource.remove(position);
notifyItemInserted(position);
notifyItemRangeChanged(position,dataSource.size() - position);
}
class MyViewHolder extends RecyclerView.ViewHolder {
View mitemView;
ImageView mimg;
TextView mtxt;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
mimg = itemView.findViewById(R.id.iv);
mtxt = itemView.findViewById(R.id.tv);
mitemView = itemView;
}
}
//接口
public interface OnItemList{
void OnTiemClick(int position);
}
}
2.MainActivity
- 1.初始化数据
- 2.实例化适配器
- 3.使用GridLayoutManager和LinearLayoutManager
public class MainActivity extends AppCompatActivity {
private RecyclerView mrecyclerView;
private RecyAdapter mrecyAdapter;
private Button bnt1,bnt2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mrecyclerView = findViewById(R.id.recycler_view);
//线性布局
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
/*//横向排列
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
//把数据修改为反向展示
layoutManager.setReverseLayout(true);*/
mrecyclerView.setLayoutManager(layoutManager);
mrecyAdapter = new RecyAdapter(this,mrecyclerView);
mrecyclerView.setAdapter(mrecyAdapter);
mrecyAdapter.setOnItemList(new RecyAdapter.OnItemList() {
@Override
public void OnTiemClick(int position) {
Toast.makeText(getBaseContext(),"第"+position+"被点击",Toast.LENGTH_SHORT).show();
}
});
mrecyclerView.setItemAnimator(new DefaultItemAnimator());
}
public void onClick(View v){
switch (v.getId()){
case R.id.bnt1:
List<String> data = new ArrayList<>();
for (int i=0;i<20;i++){
String s = "第" +i +"条数据";
data.add(s);
}
mrecyAdapter.setDataSource(data);
break;
case R.id.bnt2:
//从线性布局切换到网格布局
if (mrecyclerView.getLayoutManager().getClass() == LinearLayoutManager.class){
//切换网格
GridLayoutManager gridLayoutManager = new GridLayoutManager(this,2);
mrecyclerView.setLayoutManager(gridLayoutManager);
}else if (mrecyclerView.getLayoutManager().getClass() == GridLayoutManager.class){
//切换为瀑布流
StaggeredGridLayoutManager Sgm = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
mrecyclerView.setLayoutManager(Sgm);
}else {
//切换为线性布局
LinearLayoutManager Llm = new LinearLayoutManager(this);
mrecyclerView.setLayoutManager(Llm);
}
break;
//添加
case R.id.bnt3:
mrecyAdapter.addData(1);
break;
case R.id.bnt4:
mrecyAdapter.removerData(1);
break;
}
}
}
成果
1.添加数据

2.切换布局

