很明显就是数组越界了
目的我为什么显示报错,是因为我们想要使用recycleview来实现数据绑定,然后呢,每个item布局里面有个按钮,我想要点击item里面的按钮,然后删除当前的布局。然后我就再adapter里面使用点击事件呗,然后就再Mainactivity里面设置 adaper.notifyDataSetChanged();结果就报标题的错误了
在adapter适配器里面写一个监听接口,用于监听点击了哪一项,然后在MainActity中回调该方法,然后每删除一个数据,就调用 adaper.notifyDataSetChanged()
注:如果RecyclerView.Adapter适配器要是可以调用notifyDataSetChanged就好了,就不要回调了
1.适配器类
public class MedicineAdaper extends RecyclerView.Adapter<MedicineAdaper.MyHolder>{
private Context mcontext;
List<Medicine> mmedicines;
private OnItemClickListerner mlisterner;
public MedicineAdaper(Context context, List<Medicine> medicines, OnItemClickListerner listerner) {
this.mcontext = context;
this.mmedicines = medicines;
this.mlisterner = listerner;
}
@NonNull
@Override
public MedicineAdaper.MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new MyHolder(LayoutInflater.from(mcontext).inflate(R.layout.item,parent,false));
}
@Override
public void onBindViewHolder(@NonNull MedicineAdaper.MyHolder holder, final int position) {
holder.medicine.setText(mmedicines.get(position).medicine);
holder.way.setText(mmedicines.get(position).way);
holder.time.setText(mmedicines.get(position).time);
Log.d("safsafasfas", mmedicines.get(0).medicine);
Log.d("safsafasfas", mmedicines.get(0).way);
Log.d("safsafasfas", mmedicines.get(0).time);
holder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mlisterner.onClick(position);
}
});
}
@Override
public int getItemCount() {
return mmedicines.size();
}
//ViewHolder
class MyHolder extends RecyclerView.ViewHolder{
private TextView medicine,time,way;
ImageButton button;
public MyHolder(@NonNull View itemView) {
super(itemView);
medicine=itemView.findViewById(R.id.medicine);
time = itemView.findViewById(R.id.time);
way = itemView.findViewById(R.id.way);
button =itemView.findViewById(R.id.button);
}
}
//定义一个接口用于回调操作
public interface OnItemClickListerner{
void onClick(int pos);
}
}
2.MainActivity类
package com.mt.recycleviewtest;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
List<Medicine> medicines;
MedicineAdaper adaper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init_view_recyclerView();
}
/**
* 初始化控件
*/
private void init_view_recyclerView() {
medicines = new ArrayList<Medicine>();
Medicine medicine1 = new Medicine("8.4","安眠药","口服");
medicines.add(medicine1);
Medicine medicine2 = new Medicine("2020.3.4","莫斯利安","口服");
medicines.add(medicine2);
Medicine medicine3 = new Medicine("2020.12.5","唇膏","口服");
medicines.add(medicine3);
recyclerView=findViewById(R.id.recyclerView);
LinearLayoutManager linearLayoutManager=new LinearLayoutManager(MainActivity.this);
recyclerView.setLayoutManager(linearLayoutManager);
adaper = new MedicineAdaper(MainActivity.this, medicines, new MedicineAdaper.OnItemClickListerner() {
@Override
public void onClick(int pos) {
medicines.remove(pos);
adaper.notifyDataSetChanged();
}
});
recyclerView.setAdapter(adaper);
}
}
3.medicine类
package com.mt.recycleviewtest;
public class Medicine {
String time;
String medicine;
String way;
public Medicine(String time, String medicine, String way) {
this.time = time;
this.medicine = medicine;
this.way = way;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getMedicine() {
return medicine;
}
public void setMedicine(String medicine) {
this.medicine = medicine;
}
public String getWay() {
return way;
}
public void setWay(String way) {
this.way = way;
}
}