第7天 Recyclerview万能的适配器(基本使用、分割线、增加删除动画)
Recyclerview的使用
用了很长一段时间的RecyclerView,在项目中用的频率也越来越频繁(因为踩得坑也越来越多了),或过头来看,感觉一直在写RecyclerView.Adapter中的三个方法和一个内部类,感觉很浪费时间,那么今天我们来试着封装封装,来减少我们的使用
思路
一、创建Bean类将想要的数据封装在其中
二、创建适配器
三、实现接口进行点击事件打的接口回调
四、实例化RecyclerView,设置适配器,设置瀑布流,并在适配器中点击使用接口回调的方法来实现点击事件的吐司。
代码
Bean类
class Bean {
int pic;
String string;
public Bean(int pic, String string) {
this.pic = pic;
this.string = string;
}
public int getPic() {
return pic;
}
public void setPic(int pic) {
this.pic = pic;
}
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
}
适配器
public class MyAdpter extends RecyclerView.Adapter<MyAdpter.MyViewHoler> {
ArrayList<Bean> list;
Context context;
MyOnItemClickListener myOnItemClickListener;
public void setMyOnItemClickListener(MyOnItemClickListener myOnItemClickListener) {
this.myOnItemClickListener = myOnItemClickListener;
}
public MyAdpter(ArrayList<Bean> list, Context context) {
this.list = list;
this.context = context;
}
@NonNull
@Override
public MyViewHoler onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
final View view = LayoutInflater.from(context).inflate(R.layout.item, null);
return new MyViewHoler(view);
}
@Override
public void onBindViewHolder(@NonNull final MyViewHoler myViewHoler, final int i) {
myViewHoler.textView.setText(list.get(i).string);
Glide.with(context).load(list.get(i).pic).apply(RequestOptions.bitmapTransform(new RoundedCorners(100))).into(myViewHoler.imageView);
myViewHoler.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myOnItemClickListener.onItemClick(i);
}
});
myViewHoler.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
myOnItemClickListener.onLongClickListener(i);
return true;
}
});
}
@Override
public int getItemCount() {
return list.size();
}
//自定义类继承ViewHolder
class MyViewHoler extends RecyclerView.ViewHolder{
ImageView imageView;
TextView textView;
public MyViewHoler(@NonNull View itemView) {
super(itemView);
//itemView代表行布局
imageView = itemView.findViewById(R.id.image1);
textView = itemView.findViewById(R.id.text1);
}
}
}
接口
public interface MyOnItemClickListener {
public void onItemClick(int positon);
public void onLongClickListener(int positon);
}
item布局
<?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="match_parent"
android:orientation="vertical"
android:padding="10dp"
android:layout_margin="10dp"
>
<ImageView
android:scaleType="fitXY"
android:id="@+id/image1"
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="#7CE3E3E4"/>
<TextView
android:id="@+id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#C8C8CC"/>
</LinearLayout>
activity_main布局
<?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.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
</LinearLayout>
MainActivity代码
RecyclerView recyclerView;
MyAdpter myAdpter;
ArrayList<Bean> list = new ArrayList<>();
@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.cat,"范德萨发舒服撒啊对发范德萨萨发大事发生大的感觉撒哎哈佛I个"));
list.add(new Bean(R.mipmap.cat1,"范德萨发舒服撒啊对发生的范德萨发fdsaaf讽德诵功大事发生大的感觉撒哎哈佛I个"));
list.add(new Bean(R.mipmap.dog,"范德萨发舒服撒啊fds大的感觉撒哎哈佛I个"));
list.add(new Bean(R.mipmap.dog2,"范德萨发舒法师答复fds大事发生大的感觉撒哎哈佛I个"));
list.add(new Bean(R.mipmap.mao,"范德萨发舒服撒啊工地发生过的对发生的范德萨fsdafas发大事发生大的感觉撒哎哈佛I个"));
list.add(new Bean(R.mipmap.mao2,"范德萨发舒服规范的是谁撒啊对发生的范德萨fsdafas发大事发生大的感觉撒哎哈佛I个"));
list.add(new Bean(R.mipmap.tozi,"范德不想做服规范的是谁撒啊对发生的范德萨fsdafas发大事发生大的感觉撒哎哈佛I个"));
final MyAdpter myAdpter = new MyAdpter(list, this);
myAdpter.setMyOnItemClickListener(new MyOnItemClickListener() {//重写点击事件
@Override
public void onItemClick(int positon) {
// list.remove(positon);
// myAdpter.notifyItemRemoved(positon);//具有动画的删除效果
// myAdpter.notifyDataSetChanged();
Toast.makeText(MainActivity.this, "", Toast.LENGTH_SHORT).show();
final Bean bean = list.get(positon);
bean.setString("afdasfasdfasfasd");
myAdpter.notifyItemChanged(positon);//修改
}
@Override
public void onLongClickListener(int positon) {//重写长点击点击事件
Toast.makeText(MainActivity.this, "长按了"+positon, Toast.LENGTH_SHORT).show();
}
});
recyclerView.setAdapter(myAdpter);
// LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
// GridLayoutManager gridLayoutManager = new GridLayoutManager(this,2);
final StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(staggeredGridLayoutManager);
// 添加分割线
final DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
recyclerView.addItemDecoration(dividerItemDecoration);
//item点击事件
//添加动画
final DefaultItemAnimator defaultItemAnimator = new DefaultItemAnimator();
// defaultItemAnimator.setRemoveDuration(2000);//缓慢删除
defaultItemAnimator.setChangeDuration(2000);//缓慢修改
recyclerView.setItemAnimator(defaultItemAnimator);
}