【发布时间】:2016-06-22 07:11:08
【问题描述】:
它一直在弹出。我已经检查了我的语法。帮助! 我的代码是这样的,他们点击编辑按钮,弹出一个对话框,然后更新我的 SQLite 数据库。
这是我的 viewHolder
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView foodTextView;
TextView calorieTextView;
Button editButton;
Button deleteButton;
// each data item is just a string in this case
public ViewHolder(View v) {
super(v);
foodTextView = (TextView) v.findViewById(R.id.food_text_view);
calorieTextView = (TextView) v.findViewById(R.id.calorie_text_view);
editButton = (Button) v.findViewById(R.id.edit_button);
deleteButton = (Button) v.findViewById(R.id.delete_button);
editButton.setOnClickListener(this);
deleteButton.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if(view.getId()==R.id.edit_button){
itemClickCallback.onEditClick(this.getAdapterPosition());
} else if(view.getId()==R.id.delete_button){
itemClickCallback.onDeleteClick(this.getAdapterPosition());
}
}
}
这里是接口的实现
public void onEditClick(int p) {
foodDatabaseAdapter.helper.getWritableDatabase();
FragmentManager manager = getSupportFragmentManager();
EditItemDialog editItemDialog = new EditItemDialog();
editItemDialog.show(manager,"EditItemDialog");
}
我尝试过像getLayoutPosition() 这样的其他东西,但它做同样的事情。虽然我不记得我所做的更改,但我已经对其进行了更多编辑,但它似乎只在我每次运行应用程序时工作一次,但在我下次尝试编辑时崩溃。第一次编辑后它也不会更新。救命!
这是错误日志
06-22 10:27:18.624 25685-25685/com.leviebora.simplecaloriecounter E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.leviebora.simplecaloriecounter, PID: 25685
java.lang.NullPointerException: Attempt to invoke interface method 'void com.leviebora.simplecaloriecounter.MyAdapter$ItemClickCallback.onEditClick(int)' on a null object reference
at com.leviebora.simplecaloriecounter.MyAdapter$ViewHolder.onClick(MyAdapter.java:54)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
ItemClickCallback 在适配器类中。这是设置它的代码。
private ItemClickCallback itemClickCallback;
public interface ItemClickCallback {
void onEditClick(int p);
void onDeleteClick(int p);
}
public void setItemClickCallback(final ItemClickCallback itemClickCallback){
this.itemClickCallback = itemClickCallback;
}
这里是 onCreate
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SimpleDateFormat currentDate = new SimpleDateFormat("ddMMyyyy");
Date todayDate = new Date();
thisDate = currentDate.format(todayDate);
foodDatabaseAdapter = new FoodDatabaseAdapter(this);
/* prefs = this.getSharedPreferences("runToday", MODE_PRIVATE);
edit = prefs.edit();
itemNumber = prefs.getInt("runToday",0);*/
recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
adapter = new MyAdapter(this,getData());
recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
recyclerView.addItemDecoration(new DividerItemDecoration(this));
recyclerView.setAdapter(adapter);
adapter.setItemClickCallback(this);
}
编辑了我的适配器构造函数。这是解决方法。
public MyAdapter(Context context, List<Information> data, ItemClickCallback itemClickCallback ) {
inflater = LayoutInflater.from(context);
this.itemClickCallback = itemClickCallback;
this.data = data;
}
【问题讨论】:
-
itemClickCallback来自哪里? -
您的 itemClickCallback 为空。此外,每当您创建一个侦听器时,只需在使用它之前检查它是否为空。
-
那么你在哪里注册 setItemClickCallback() 方法?
标签: android sqlite android-recyclerview