【问题标题】:NotifyDatasetchanged not working. AppCrashes after ButtonOnClick [duplicate]NotifyDatasetchanged 不起作用。 ButtonOnClick 后 AppCrashes [重复]
【发布时间】:2020-04-05 17:22:01
【问题描述】:

我一直在尝试创建一个按钮,在单击时向我的 Arraylist (contries) 添加一个新值,但它没有添加我的项目 (Card),而是应用程序崩溃了。我也在使用片段。这是我的代码。

那是我的 FragmentPage 类

package com.example.barryblack;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

public class FragmentPage extends Fragment {

private RecyclerView.Adapter mAdapter;
private ArrayList countries;
Button btn;






@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable 
Bundle savedInstanceState) {

    CreateExampleList();

    View view = inflater.inflate(R.layout.page_fragment, container, false);

    RecyclerView recyclerView = view.findViewById(R.id.listRecyclerView);

    btn = view.findViewById(R.id.button_insert);

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            InsertItem();

        }
    });

    recyclerView.setHasFixedSize(true);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);
    RecyclerView.Adapter adapter = new MyAdapter(countries);
    recyclerView.setAdapter(adapter);


    return view;
}

public void InsertItem() {
    countries.add("Smile");
    mAdapter.notifyDataSetChanged();


}

private void CreateExampleList() {
    countries = new ArrayList<String>();
    countries.add("Eat");
    countries.add("Kill");

}





}

这是我的自定义适配器

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private ArrayList<String> cards;

public MyAdapter(ArrayList<String> countries) {
    this.cards = countries;
}

@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.example_item, viewGroup, 
false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(MyAdapter.ViewHolder viewHolder, int i) {

    viewHolder.tv_country.setText(cards.get(i));
}

@Override
public int getItemCount() {
    return cards.size();
}

public class ViewHolder extends RecyclerView.ViewHolder{
    private TextView tv_country;
    private Button tv_button;
    public ViewHolder(View view) {
        super(view);

        tv_country = (TextView)view.findViewById(R.id.tv_country);

    }
}

}public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private ArrayList<String> cards;

public MyAdapter(ArrayList<String> countries) {
    this.cards = countries;
}

@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.example_item, viewGroup, 
false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(MyAdapter.ViewHolder viewHolder, int i) {

    viewHolder.tv_country.setText(cards.get(i));
}

@Override
public int getItemCount() {
    return cards.size();
}

public class ViewHolder extends RecyclerView.ViewHolder{
    private TextView tv_country;
    private Button tv_button;
    public ViewHolder(View view) {
        super(view);

        tv_country = (TextView)view.findViewById(R.id.tv_country);

    }
}

}

还有我的 LogcatText

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void androidx.recyclerview.widget.RecyclerView$Adapter.notifyDataSetChanged()” 在 com.example.barryblack.FragmentPage.InsertItem(FragmentPage.java:60) 在 com.example.barryblack.FragmentPage$1.onClick(FragmentPage.java:43)

【问题讨论】:

  • MyAdapter adapter = new MyAdapter(countries);
  • 所以我用你的 Recycler.Adapter 切换了,但我仍然得到相同的错误,应用程序仍然崩溃
  • 你永远不会在任何地方分配mAdapter,所以它在InsertItem() 中为空。将 RecyclerView.Adapter adapter = new MyAdapter(countries); 更改为 mAdapter = new MyAdapter(countries);。请注意,该行的开头没有类型。
  • 非常感谢您的帮助,我能够完成它:D

标签: java android android-studio crash dynamically-generated


【解决方案1】:

此代码private RecyclerView.Adapter mAdapter;

必须是private MyAdapter mAdapter;

还有这个RecyclerView.Adapter adapter = new MyAdapter(countries);

到这个MyAdapter mAdapter = new MyAdapter(countries);

【讨论】:

  • 我不想成为那个人,但它仍然崩溃。我仍然在空对象引用上收到此 Logcat 错误 void com.example.barryblack.MyAdapter.notifyDataSetChanged()'。我真的认为错误在 insert Item 方法中。尽管如此,我仍然非常感谢您的快速回答。
  • 我认为你必须将你的初始变量移动到 onviewcreated。让 oncreateview 声明你的布局
猜你喜欢
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多