【问题标题】:I get a NullExceptionPointer on my onClickListener on my RecyclerView [duplicate]我在 RecyclerView 上的 onClickListener 上收到 NullExceptionPointer [重复]
【发布时间】: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


【解决方案1】:

请检查“itemClickCallback”接口未正确初始化..可能是

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        ItemClickCallback itemClickCallback;

        public interface ItemClickCallback {
            void onEditClick(int p);
            void onDeleteClick(int p);
        }


         public ViewHolder(View v, ItemClickCallback itemClickCallback) {
                super(v);
                ...........................
            .............................
             this.itemClickCallback = itemClickCallback;
            } 

}

【讨论】:

  • 如何初始化?
  • 我的假设是正确的..请检查...我想你明白了,但我分享了我的完整答案..
【解决方案2】:

在你的适配器上编写函数

 public void setTtemClickCallback(itemClickCallback item) {
   this.itemClickCallback = item;
 }

并给出片段

adaptor.setTtemClickCallback(this);

希望对你有帮助

【讨论】:

  • 它已经在我的适配器和我的活动中。
  • 你确定要注册接口吗,像这样adaptorobject.setTtemClickCallback(this);@wonderland0422
  • 尝试将 Activity.this 传递给 MyAdaptor @wonderland0422
  • adapter = new MyAdapter(Activity.this,getData());类似的东西?它显示一个红色下划线。
【解决方案3】:

您必须将回调传递给视图持有者。例如,通过构造函数:

private ItemClickCallback itemClickCallback;

public ViewHolder(View v, ItemClickCallback itemClickCallback) {
    super(v);
    this.itemClickCallback = itemClickCallback;
    //more code
}

【讨论】:

  • 还是不行。
  • 显示初始化视图持有者的代码。
  • 我已经修好了。我会在编辑中添加。谢谢!
猜你喜欢
  • 2016-11-05
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多