尝试调用接口方法';java.lang.Object java.util.List.remove(int)和#x27;在空对象引用上|尝试从回收器视图中删除
我试图从回收器视图中删除,但我收到错误,不知道原因。我正在收听删除按钮的点击,并将id发送到要删除的主要活动,但它说列表为空,不应该为空!我想在单击按钮时从recycler视图中删除一个项目,该项目链接到一个项目id,该id被发送到mainactivity以从productList中删除,但在onCreate上明确加载了大量元素时表示为空尝试调用接口方法';java.lang.Object java.util.List.remove(int)和#x27;在空对象引用上|尝试从回收器视图中删除,java,android-studio,Java,Android Studio,我试图从回收器视图中删除,但我收到错误,不知道原因。我正在收听删除按钮的点击,并将id发送到要删除的主要活动,但它说列表为空,不应该为空!我想在单击按钮时从recycler视图中删除一个项目,该项目链接到一个项目id,该id被发送到mainactivity以从productList中删除,但在onCreate上明确加载了大量元素时表示为空 这是main活动类: public class MainActivity extends AppCompatActivity { private
这是
main活动
类:
public class MainActivity extends AppCompatActivity {
private Toolbar mainToolBar;
private AdView mAdView;
RecyclerView recyclerView;
ProductAdapter adapter;
List<Product> productList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loadData();
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new ProductAdapter(this, productList);
recyclerView.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
startActivity(new Intent(MainActivity.this, activity_add.class));
return true;
}
public void deleteItem(int id){
id = id - 1;
productList.remove(id);
adapter.notifyItemRemoved(id);
}
private void loadData(){
SharedPreferences sharedPreferences = getSharedPreferences("shared
prefs", 0);
Gson gson = new Gson();
String json = sharedPreferences.getString("items", null);
Type type = new TypeToken<ArrayList<Product>>(){}.getType();
productList = gson.fromJson(json, type);
if(productList == null){
productList = new ArrayList<>();
}
}
private void addToList(){
SharedPreferences sharedPreferences = getSharedPreferences("shared prefs", 0);
SharedPreferences.Editor editor = sharedPreferences.edit();
Gson gson = new Gson();
String json = gson.toJson(productList);
editor.putString("items", json);
editor.apply();
}
}
public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.ProductViewHolder>{
private Context mCtx;
private List<Product> productList;
public ProductAdapter(Context mCtx, List<Product> productList) {
this.mCtx = mCtx;
this.productList = productList;
}
@NonNull
@Override
public ProductViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(mCtx);
View view = inflater.inflate(R.layout.list_layout, null);
return new ProductViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ProductViewHolder holder, int position) {
final Product product = productList.get(position);
holder.textViewTitle.setText(product.getTitle());
holder.textViewRating.setText(String.valueOf(product.getRating()));
holder.deleteBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new MainActivity().deleteItem(product.getId());
}
});
}
@Override
public int getItemCount() {
return productList.size();
}
class ProductViewHolder extends RecyclerView.ViewHolder{
TextView textViewTitle, textViewRating;
Button deleteBtn;
public ProductViewHolder(View itemView) {
super(itemView);
textViewTitle = itemView.findViewById(R.id.textViewTitle);
textViewRating = itemView.findViewById(R.id.textViewRating);
deleteBtn = itemView.findViewById(R.id.deleteBtn);
}
}
}
问题是您试图在此处创建
MainActivity
的新实例:
newmainActivity().deleteItem(product.getId())代码>
您的main活动
应该实现一个侦听器,然后您可以将其传递给ProductAdapter
构造函数:
deleteListener.deleteItem(product.getId())
在loadData()和mainActivity的顶部初始化变量productList
?是否发布该方法?您刚刚更新了它,本打算添加但无意中遗漏了它我真的不明白实现侦听器是什么以及如何实现它我只想在主活动中调用一个函数,该函数可以更新列表,然后更新回收器视图并将其保存到共享首选项中