RecyclerView依赖: implementation 'com.android.support:recyclerview-v7:28.0.0
RecyclerView是谷歌官方推荐的用来代替ListView的布局管理器
RecyclerView相对于ListView的优点
- RecyclerView比ListView实现的效果更多
- RecyclerView支持多布局
- RecyclerView根据项目的需要插拔功能
- RecyclerView的适配器相比ListViwe减少大量代码量
RecyclerView无法直接实现item点击事件需要通过接口回调的方式实现
public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
ArrayList<Bean> list = new ArrayList<>();
MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.rv);
list.add(new Bean(R.mipmap.a,"awsl"));
list.add(new Bean(R.mipmap.a1,"awsl"));
list.add(new Bean(R.mipmap.a2,"awsl"));
list.add(new Bean(R.mipmap.a3,"awsl"));
list.add(new Bean(R.mipmap.a4,"awsl"));
list.add(new Bean(R.mipmap.a5,"awsl"));
list.add(new Bean(R.mipmap.a6,"awsl"));
list.add(new Bean(R.mipmap.a7,"awsl"));
list.add(new Bean(R.mipmap.a8,"awsl"));
list.add(new Bean(R.mipmap.a9,"awsl"));
list.add(new Bean(R.mipmap.a10,"awsl"));
list.add(new Bean(R.mipmap.a11,"awsl"));
adapter = new MyAdapter(list,this);
recyclerView.setAdapter(adapter);
//有三种布局格式:
//LinearLayoutManager
//StaggeredGridLayoutManager(瀑布流布局) 参数一:瀑布列数 参数二:格式 根据需求选择
//GridLayoutManager
final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(staggeredGridLayoutManager);
//用在适配器中回调的点击事件
adapter.setInterfaceDemo(new InterfaceDemo() {
@Override
public void onclick(int position) {
Toast.makeText(MainActivity.this, ""+position+"被点击了", Toast.LENGTH_SHORT).show();
// list.remove(position);
// list.add(new Bean(R.mipmap.a11,"wdnmd"));
Bean bean = list.get(position);
bean.setName("wdnmd");
//刷新删除的条目
// adapter.notifyItemRemoved(position);
//刷新添加的动画
adapter.notifyItemChanged(position);
}
});
//添加动画
DefaultItemAnimator defaultItemAnimator = new DefaultItemAnimator();
//不同的修改要用不同的刷新
defaultItemAnimator.setRemoveDuration(2000);
defaultItemAnimator.setChangeDuration(2000);
defaultItemAnimator.setAddDuration(2000);
recyclerView.setItemAnimator(defaultItemAnimator);
}
}
class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
ArrayList<Bean> list;
Context context;
//实现接口
InterfaceDemo interfaceDemo;
//重写set方法
public void setInterfaceDemo(InterfaceDemo interfaceDemo) {
this.interfaceDemo = interfaceDemo;
}
public MyAdapter(ArrayList<Bean> list, Context context) {
this.list = list;
this.context = context;
}
@NonNull
@Override
public MyAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, final int i) {
//设置布局填充
View view = LayoutInflater.from(context).inflate(R.layout.item_layout, null);
//返回一个自定义的Holder类
return new MyViewHolder(view);
}
//绑定ViewHolder 设置内容
@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, final int i) {
Bean bean = list.get(i);
myViewHolder.textView.setText(list.get(i).getName()+"");
// RequestOptions requestOptions = new RequestOptions();
Glide.with(context).applyDefaultRequestOptions(RequestOptions.bitmapTransform(new RoundedCorners(30))).load(list.get(i).getImageView()).into(myViewHolder.imageView);
// myViewHolder.imageView.setImageResource(list.get(i).getImageView());
//设置点击事件
myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//实现接口的方法 将item下标传进去
interfaceDemo.onclick(i);
}
});
// LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) myViewHolder.imageView.getLayoutParams();
//获取条目的宽度
// float itemwidth = (ScreenUtils.getScreenWidth(myViewHolder.itemView.getContext())-10*3)/2;
// layoutParams.weight = (int)itemwidth;
// float scale = (itemwidth+0f)/bean.
}
@Override
public int getItemCount() {
return list.size();
}
//相当于listView中的ViewHolder 用来搜索控件
class MyViewHolder extends RecyclerView.ViewHolder{
ImageView imageView;
TextView textView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.imageView);
ViewGroup.LayoutParams layoutParams = imageView.getLayoutParams();
//设置一个范围内的随机item高度 实现瀑布效果
int random = (int)(Math.random()*400+200);
Toast.makeText(context, ""+random, Toast.LENGTH_SHORT).show();
layoutParams.height = random;
imageView.setLayoutParams(layoutParams);
textView = itemView.findViewById(R.id.textView);
}
}
}
//接口
public interface InterfaceDemo {
public void onclick(int position);
}