Java NotifyDatasetchanged不工作。应用程序在单击按钮后崩溃
我一直在尝试创建一个按钮,在单击时为我的Arraylist(contries)添加一个新值,但它没有添加我的项目(卡片),应用程序只是崩溃了。我也在使用片段。这是我的密码 那是我的班级,我的零碎页面Java NotifyDatasetchanged不工作。应用程序在单击按钮后崩溃,java,android,android-studio,crash,dynamically-generated,Java,Android,Android Studio,Crash,Dynamically Generated,我一直在尝试创建一个按钮,在单击时为我的Arraylist(contries)添加一个新值,但它没有添加我的项目(卡片),应用程序只是崩溃了。我也在使用片段。这是我的密码 那是我的班级,我的零碎页面 package com.example.barryblack; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup
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");
}
}
package com.example.barryblack;
导入android.os.Bundle;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.Button;
导入androidx.annotation.NonNull;
导入androidx.annotation.Nullable;
导入androidx.fragment.app.fragment;
导入androidx.recyclerview.widget.LinearLayoutManager;
导入androidx.recyclerview.widget.recyclerview;
导入java.util.ArrayList;
公共类碎片页扩展了碎片{
专用回收器查看适配器mAdapter;
私营ArrayList国家;
按钮btn;
@可空
@凌驾
创建视图时的公共视图(@NonNull LayoutInflater inflater,@Nullable ViewGroup container,@Nullable
Bundle savedInstanceState){
CreateExampleList();
视图=充气机。充气(R.layout.page_碎片,容器,false);
RecyclerView RecyclerView=view.findViewById(R.id.listRecyclerView);
btn=view.findviewbyd(R.id.button\u insert);
btn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
插入项();
}
});
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager LayoutManager=新的LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(layoutManager);
RecyclerView.Adapter=新的MyAdapter(国家/地区);
recyclerView.setAdapter(适配器);
返回视图;
}
public void InsertItem(){
添加(“微笑”);
mAdapter.notifyDataSetChanged();
}
私有void CreateExampleList(){
国家/地区=新阵列列表();
添加(“Eat”);
添加(“杀死”);
}
}
这是我的自定义适配器
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);
}
}
}
公共类MyAdapter扩展了RecyclerView.Adapter{
私人ArrayList卡;
公共MyAdapter(ArrayList国家/地区){
这意味着国家;
}
@凌驾
public MyAdapter.ViewHolder onCreateViewHolder(视图组视图组,int i){
View View=LayoutFlater.from(viewGroup.getContext())。充气(R.layout.example_项,视图组,
假);
返回新的ViewHolder(视图);
}
@凌驾
public void onBindViewHolder(MyAdapter.ViewHolder-ViewHolder,int i){
viewHolder.tv_country.setText(cards.get(i));
}
@凌驾
public int getItemCount(){
返回卡。大小();
}
公共类ViewHolder扩展了RecyclerView.ViewHolder{
国家/地区的私人文本视图电视;
专用按钮tv_按钮;
公共视图持有者(视图){
超级(视图);
tv_country=(TextView)view.findviewbyd(R.id.tv_country);
}
}
}公共类MyAdapter扩展了RecyclerView.Adapter{
私人ArrayList卡;
公共MyAdapter(ArrayList国家/地区){
这意味着国家;
}
@凌驾
public MyAdapter.ViewHolder onCreateViewHolder(视图组视图组,int i){
View View=LayoutFlater.from(viewGroup.getContext())。充气(R.layout.example_项,视图组,
假);
返回新的ViewHolder(视图);
}
@凌驾
public void onBindViewHolder(MyAdapter.ViewHolder-ViewHolder,int i){
viewHolder.tv_country.setText(cards.get(i));
}
@凌驾
public int getItemCount(){
返回卡。大小();
}
公共类ViewHolder扩展了RecyclerView.ViewHolder{
国家/地区的私人文本视图电视;
专用按钮tv_按钮;
公共视图持有者(视图){
超级(视图);
tv_country=(TextView)view.findviewbyd(R.id.tv_country);
}
}
}
还有我的博客
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)这段代码
私有回收视图.Adapter mAdapter代码>
必须是private MyAdapter mAdapter代码>
这个RecyclerView.Adapter=新的MyAdapter(国家/地区)代码>
此MyAdapter mAdapter=新的MyAdapter(国家/地区)代码>MyAdapter=新的MyAdapter(国家/地区)
因此我将Recycler.Adapter与您的适配器切换,但我仍然收到相同的错误,应用程序仍然崩溃。您从未将mAdapter
分配到任何位置,因此InsertItem()
中的值为空。更改RecyclerView.Adapter=新的MyAdapter(国家/地区)代码>至mAdapter=新MyAdapter(国家/地区)代码>。请注意,这行开头没有输入。非常感谢您的帮助,我终于完成了:我不想成为那个家伙,但它仍然崩溃了。对于空对象引用,我仍然会收到此Logcat错误void com.example.barryblack.MyAdapter.notifyDataSetChanged()。我真的认为错误在insertitem方法中。尽管如此,我仍然非常感谢您的快速回答。我认为您必须将初始变量移动到onviewcreated。让oncreateview声明您的布局