Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RecyclerView在设置时引发null异常_Java_Android_Xml - Fatal编程技术网

Java RecyclerView在设置时引发null异常

Java RecyclerView在设置时引发null异常,java,android,xml,Java,Android,Xml,只是为了好玩而做一个android项目。我在用户尝试登录后返回错误。我在错误所在的行附近做了一次尝试捕捉,对象本身是null。现在我知道了这一点,我正试图弄明白为什么在我执行findViewById()时它没有被设置。我将把相关代码粘贴到下面 java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setAdapter(andr

只是为了好玩而做一个android项目。我在用户尝试登录后返回错误。我在错误所在的行附近做了一次尝试捕捉,对象本身是
null
。现在我知道了这一点,我正试图弄明白为什么在我执行
findViewById()
时它没有被设置。我将把相关代码粘贴到下面

java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setAdapter(androidx.recyclerview.widget.RecyclerView$Adapter)' on a null object reference
MainActivity.java

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.AbsListView;
import android.widget.Adapter;
import android.widget.SearchView;

import com.google.android.material.bottomnavigation.BottomNavigationView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    MyProductAdapter myProductAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        BottomNavigationView navView = findViewById(R.id.nav_view);
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications).build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
        NavigationUI.setupWithNavController(navView, navController);

        RecyclerView recyclerView;
        recyclerView = findViewById(R.id.listId);
        System.out.println("This is recyclverView" + recyclerView);
        try {
            recyclerView.setHasFixedSize(true);
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
            recyclerView.setHasFixedSize(true);

        } catch (NullPointerException e) {
            System.out.println("null here" + e.getCause());
        }

        ArrayList<MyProduct> myProductData = new ArrayList<>();
        myProductData.add(new MyProduct("Panadol", "Pill  for headAche", "Price : $2.99", R.drawable.logo2));
        myProductData.add(new MyProduct("Nyquill", "Pill  for headAche", "Price : $2.99", R.drawable.logo2));
        myProductData.add(new MyProduct("ZAck", "Pill  for headAche", "Price : $2.99", R.drawable.logo2));
        myProductData.add(new MyProduct("Codeine", "Pill  for headAche", "Price : $2.99", R.drawable.logo2));


        myProductAdapter = new MyProductAdapter(myProductData, MainActivity.this);
        recyclerView.setAdapter(myProductAdapter);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.menu_bar, menu);
        MenuItem menuItem = menu.findItem(R.id.search);
        SearchView searchView = (SearchView) menuItem.getActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {

                myProductAdapter.getFilter().filter(s);
                return false;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }

}
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;

import com.example.medistak.R;

public class DashboardFragment extends Fragment {

    private DashboardViewModel dashboardViewModel;

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        
        dashboardViewModel =
                new ViewModelProvider(this).get(DashboardViewModel.class);
        View root = inflater.inflate(R.layout.fragment_dashboard, container, false);
        dashboardViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
            @Override
            public void onChanged(@Nullable String s) {

            }
        });
        return root;
    }
}
DashBoardFragment.java

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.AbsListView;
import android.widget.Adapter;
import android.widget.SearchView;

import com.google.android.material.bottomnavigation.BottomNavigationView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    MyProductAdapter myProductAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        BottomNavigationView navView = findViewById(R.id.nav_view);
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications).build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
        NavigationUI.setupWithNavController(navView, navController);

        RecyclerView recyclerView;
        recyclerView = findViewById(R.id.listId);
        System.out.println("This is recyclverView" + recyclerView);
        try {
            recyclerView.setHasFixedSize(true);
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
            recyclerView.setHasFixedSize(true);

        } catch (NullPointerException e) {
            System.out.println("null here" + e.getCause());
        }

        ArrayList<MyProduct> myProductData = new ArrayList<>();
        myProductData.add(new MyProduct("Panadol", "Pill  for headAche", "Price : $2.99", R.drawable.logo2));
        myProductData.add(new MyProduct("Nyquill", "Pill  for headAche", "Price : $2.99", R.drawable.logo2));
        myProductData.add(new MyProduct("ZAck", "Pill  for headAche", "Price : $2.99", R.drawable.logo2));
        myProductData.add(new MyProduct("Codeine", "Pill  for headAche", "Price : $2.99", R.drawable.logo2));


        myProductAdapter = new MyProductAdapter(myProductData, MainActivity.this);
        recyclerView.setAdapter(myProductAdapter);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.menu_bar, menu);
        MenuItem menuItem = menu.findItem(R.id.search);
        SearchView searchView = (SearchView) menuItem.getActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {

                myProductAdapter.getFilter().filter(s);
                return false;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }

}
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;

import com.example.medistak.R;

public class DashboardFragment extends Fragment {

    private DashboardViewModel dashboardViewModel;

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        
        dashboardViewModel =
                new ViewModelProvider(this).get(DashboardViewModel.class);
        View root = inflater.inflate(R.layout.fragment_dashboard, container, false);
        dashboardViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
            @Override
            public void onChanged(@Nullable String s) {

            }
        });
        return root;
    }
}
导入android.os.Bundle;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.TextView;
导入androidx.annotation.NonNull;
导入androidx.annotation.Nullable;
导入androidx.fragment.app.fragment;
导入androidx.lifecycle.Observer;
导入androidx.lifecycle.ViewModelProvider;
导入com.example.medistak.R;
公共类DashboardFragment扩展了该片段{
专用仪表板视图模型仪表板视图模型;
公共视图onCreateView(@NonNull layoutiner充气机,
视图组容器,捆绑包savedInstanceState){
仪表板视图模型=
新建ViewModelProvider(this.get)(DashboardViewModel.class);
视图根=充气机。充气(R.layout.fragment_仪表板,容器,错误);
dashboardViewModel.getText().observe(getViewLifecycleOwner(),new Observer()){
@凌驾
公共void onChanged(@Nullable String s){
}
});
返回根;
}
}
Edit(在OP之后添加
DashboardFragment
类) 将
MyProductAdapter
recyclerView
代码从
MainActivity
移动到
DashboardFragment
onCreateView()
方法,如下所示:

RecyclerView recyclerView = findViewById(R.id.listId);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(myProductAdapter);

您的
RecyclerView
listId
驻留在
仪表板片段中,而您正在
MainActivity
类中初始化和设置它。出现
空对象引用
错误的原因是
活动
及其底层
片段
添加到
backbackback
的顺序

首先设置
main活动。然后跟随
MainActivity
中的
Fragments
,在您的示例中,是
仪表板Fragments
。因此,如果您要设置
仪表板片段的
recyclerView
,从
MainActivity的角度来看,它甚至不存在,而且尚未创建
,当然会导致
NPE


您的问题的解决方案是从
main活动
类中取出所有
recyclerView
设置代码,并将其转移到
DashboardFragment

中,检查
R.id.listId
是否已分配给
R.layout.activity\u main2中的
recyclerView
,请参阅更新的代码plz.I已更新我的DashBoardFragment类。请建议我应该添加/删除哪些内容。getting
无法解析Dashboard fragment中的方法findViewById
任何想法@karan Dhilo您不能在片段中直接调用
findViewById()
。调用
getView().findViewById()
。非常感谢@karan dhillon