【问题标题】:App crashing when trying to use RecyclerView With LayoutManager尝试将 RecyclerView 与 LayoutManager 一起使用时应用程序崩溃
【发布时间】:2018-07-30 12:39:31
【问题描述】:

我正在尝试在 RecyclerView 中显示数据,但应用程序严重错误:

尝试调用虚方法'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' 在空对象引用上

RecyclerView的声明:

RecyclerView rvTodos;

findViewByid RecyclerView:

rvTodos = (RecyclerView) findViewById(R.id.rvTodos);

这是我的SetAdapter 课程:

private void setAdapters() {
        todosAdapter = new TodosAdapter(toDoList);
        RecyclerView.LayoutManager mLayoutManager1 = new LinearLayoutManager(getApplicationContext());
        rvTodos.setLayoutManager(mLayoutManager1);
        rvTodos.setItemAnimator(new DefaultItemAnimator());
        rvTodos.setAdapter(todosAdapter);
    }

打开 Logcat 并显示错误,我点击错误然后它就在这一行:

rvTodos.setItemAnimator(new DefaultItemAnimator());

这是我的TodosListActivity.class

public class TodosListActivity extends AppCompatActivity implements View.OnClickListener{

    TextView txtTitle, txtClose, txtSave, txtAdd;

    String label_todos, text_add_todo;

    RecyclerView rvTodos;

    private List<ToDo> toDoList = new ArrayList<>();
    private TodosAdapter todosAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_events_list);

        init();
    }

    private void init() {

        txtTitle = (TextView) findViewById(R.id.txtTitle);
        label_todos = getResources().getString(R.string.label_todos);
        txtTitle.setText(label_todos);

        txtSave = (TextView) findViewById(R.id.txtSave);
        txtSave.setVisibility(View.GONE);

        txtClose = (TextView) findViewById(R.id.txtClose);
        txtClose.setOnClickListener(this);
        txtAdd = (TextView) findViewById(R.id.txtAdd);
        txtAdd.setOnClickListener(this);
        text_add_todo = getResources().getString(R.string.text_add_todo);
        txtAdd.setText(text_add_todo);

        rvTodos = (RecyclerView) findViewById(R.id.rvTodos);

        setAdapters();
        prepareToDOData();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {

            case R.id.txtAdd:
                Intent intent = new Intent(this, AddTodoActivity.class);
                startActivity(intent);
                break;

            case R.id.txtClose:
                finish();
                break;

        }

    }

    private void setAdapters() {
        todosAdapter = new TodosAdapter(toDoList);
        RecyclerView.LayoutManager mLayoutManager1 = new LinearLayoutManager(getApplicationContext());
        rvTodos.setLayoutManager(mLayoutManager1);
        rvTodos.setItemAnimator(new DefaultItemAnimator());
        rvTodos.setAdapter(todosAdapter);
    }

    private void prepareToDOData() {
        ToDo data = new ToDo("David Cummings", "26/10/2017 2:25PM");
        toDoList.add(data);

        data = new ToDo("Lawrence Cummings", "26/10/2017 2:25PM");
        toDoList.add(data);


        data = new ToDo("Ketul Inc.", "11/11/2017 3:46 PM");
        toDoList.add(data);

        //notesAdapter.notifyDataSetChanged();
        todosAdapter.notifyDataSetChanged();
    }
}

我参考了这个链接,但它对我不起作用: App crashing when trying to use RecyclerView on android 5.0

What is a NullPointerException, and how do I fix it?不重复

【问题讨论】:

  • 我会尝试,但这对我不起作用@NileshRathod
  • 发布您的 xml 代码
  • 是否处于片段活动中
  • 首先确保您在 onCreate 或更高版本中调用 findViewById 并且资源 id 有效

标签: java android


【解决方案1】:

正如您提到的,您使用了两个reyclerView,所以请检查您的recyclerview Id 是否完美recyclerview id,或者您为两个recyclerview 分配相同的id

参考代码:

参考:https://www.androidhive.info/2016/01/android-working-with-recycler-view/

setAdapters()内调用prepareToDOData();

     private void setAdapters() {
        todosAdapter = new TodosAdapter(toDoList);
        RecyclerView.LayoutManager mLayoutManager1 = new LinearLayoutManager(getApplicationContext());
        rvTodos.setLayoutManager(mLayoutManager1);
        rvTodos.setItemAnimator(new DefaultItemAnimator());
        rvTodos.setAdapter(todosAdapter);

        prepareToDOData();//call here
    }


 private void prepareToDOData() {
        ToDo data = new ToDo("David Cummings", "26/10/2017 2:25PM");
        toDoList.add(data);

        data = new ToDo("Lawrence Cummings", "26/10/2017 2:25PM");
        toDoList.add(data);


        data = new ToDo("Ketul Inc.", "11/11/2017 3:46 PM");
        toDoList.add(data);

        //notesAdapter.notifyDataSetChanged();
        todosAdapter.notifyDataSetChanged();
    }

【讨论】:

  • 为什么prepareToDOData() 必须在setAdapters() 内部调用?如果没有会发生什么?
  • 我有其他班级,我声明相同的方式或班级工作完美,所以这不是正确的答案
  • 你是否得到运行时异常或编译时间@MohammadAli
  • @MohammadAli,评论该行并检查您是否遇到任何其他问题?
  • 我在这一行得到了我的解决方案rvTodos = (RecyclerView) findViewById(R.id.rvTodos); 我传递了错误的 id 所以它产生了错误@Abhishekkumar
猜你喜欢
  • 2015-02-09
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多