Java 在片段中的recyclerView上使用findViewById时获取NullPointerException
正在尝试使用5个片段构建应用程序。第一个包含recyclerView,每当我切换选项卡时,视图都会被丢弃,每当我在充气机充气时返回视图时,应用程序都会尝试获取recyclerView的id,该id返回空指针异常。这个问题只会变得越来越复杂,我不认为用正确的方法来做这件事,因为我会犯错误 如果您有任何简单的应用程序示例,其中包含具有recyclerViews的片段,请删除下面的链接,提前感谢您 MainActivity.javaJava 在片段中的recyclerView上使用findViewById时获取NullPointerException,java,android,android-recyclerview,Java,Android,Android Recyclerview,正在尝试使用5个片段构建应用程序。第一个包含recyclerView,每当我切换选项卡时,视图都会被丢弃,每当我在充气机充气时返回视图时,应用程序都会尝试获取recyclerView的id,该id返回空指针异常。这个问题只会变得越来越复杂,我不认为用正确的方法来做这件事,因为我会犯错误 如果您有任何简单的应用程序示例,其中包含具有recyclerViews的片段,请删除下面的链接,提前感谢您 MainActivity.java class MainActivity extends AppComp
class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private FragmentHome fragmentHome = new FragmentHome(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragmentHome.initGetData();
BottomNavigationView bottomNavigationView = findViewById(R.id.bottomNavBar);
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragmentHome).commit();
fragmentHome.initRecyclerView();
bottomNavigationView.setOnNavigationItemSelectedListener(navListener);
bottomNavigationView.setOnNavigationItemReselectedListener(new BottomNavigationView.OnNavigationItemReselectedListener() {
@Override
public void onNavigationItemReselected(@NonNull MenuItem menuItem) {
}
});
}
private BottomNavigationView.OnNavigationItemSelectedListener navListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.home: {
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragmentHome).commit();
fragmentHome.initRecyclerView();
break;
}
}
return true;
}
};
}
public class FragmentHome extends Fragment {
private String BASE_URL = "https://www.reddit.com";
// INIT RETROFIT AND CALL ONCE AND FOR ALL
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
RedditAPI redditAPI = retrofit.create(RedditAPI.class);
private static final String TAG = "FragmentHome";
private RecyclerView feedRecyclerView;
private List<ChildrenData> childrenData;
private String after;
private String previousAfter = "";
private Boolean isScrolling = false;
private int currentItems;
private int totalItems;
private int scrolledOutItems;
private Context context;
private View inflatingView;
public FragmentHome() {
}
public FragmentHome(Context context) {
this.context = context; //I also get some attribute warning
here not important right now though.
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
inflatingView = inflater.inflate(R.layout.fragment_home, container, false);
initRecyclerView();
return inflatingView;
}
public void initGetData() {
Call<FeedData> feedDataCall = redditAPI.getFeed();
feedDataCall.enqueue(new Callback<FeedData>() {
@Override
public void onResponse(Call<FeedData> call, final Response<FeedData> response) {
/* Log.d(TAG, "onResponse: " + response.body().getData().getChildren().get(0).getDataModel().getTitle());
Log.d(TAG, "onResponse: " + response.body().getData().getChildren());*/
childrenData = response.body().getData().getChildren();
Log.d(TAG, "onResponse: " + childrenData);
after = response.body().getData().getAfter();
Log.d(TAG, "onResponse: " + after);
}
@Override
public void onFailure(Call<FeedData> call, Throwable t) {
Log.d(TAG, "onFailure: " + t.getMessage());
}
});
}
public void initRecyclerView() {
feedRecyclerView = inflatingView.findViewById(R.id.recyclerView);
final FeedRecyclerViewAdapter feedRecyclerViewAdapter = new FeedRecyclerViewAdapter(childrenData, context);
feedRecyclerView.setAdapter(feedRecyclerViewAdapter);
final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
feedRecyclerView.setLayoutManager(linearLayoutManager);
feedRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
isScrolling = true;
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
currentItems = linearLayoutManager.getChildCount();
totalItems = linearLayoutManager.getItemCount();
scrolledOutItems = linearLayoutManager.findFirstVisibleItemPosition();
if (isScrolling && (totalItems - 1 == currentItems + scrolledOutItems) && (!previousAfter.equals(after))) {
isScrolling = false;
fetchNewData(after, feedRecyclerViewAdapter);
}
}
});
}
public void fetchNewData(final String after_use, final FeedRecyclerViewAdapter feedRecyclerViewAdapter) {
Call<FeedData> feedDataCall_withAfter = redditAPI.getFeed_withAfter(after_use);
previousAfter = after_use;
feedDataCall_withAfter.clone().enqueue(new Callback<FeedData>() {
@Override
public void onResponse(Call<FeedData> call, Response<FeedData> response) {
Log.d(TAG, "onResponse: " + response.body().toString());
childrenData.addAll(response.body().getData().getChildren());
after = response.body().getData().getAfter();
feedRecyclerViewAdapter.notifyDataSetChanged();
}
@Override
public void onFailure(Call<FeedData> call, Throwable t) {
}
});
Log.d(TAG, "fetchNewData: " + childrenData.size());
}
}
FragmentHome.java
class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private FragmentHome fragmentHome = new FragmentHome(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragmentHome.initGetData();
BottomNavigationView bottomNavigationView = findViewById(R.id.bottomNavBar);
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragmentHome).commit();
fragmentHome.initRecyclerView();
bottomNavigationView.setOnNavigationItemSelectedListener(navListener);
bottomNavigationView.setOnNavigationItemReselectedListener(new BottomNavigationView.OnNavigationItemReselectedListener() {
@Override
public void onNavigationItemReselected(@NonNull MenuItem menuItem) {
}
});
}
private BottomNavigationView.OnNavigationItemSelectedListener navListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.home: {
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragmentHome).commit();
fragmentHome.initRecyclerView();
break;
}
}
return true;
}
};
}
public class FragmentHome extends Fragment {
private String BASE_URL = "https://www.reddit.com";
// INIT RETROFIT AND CALL ONCE AND FOR ALL
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
RedditAPI redditAPI = retrofit.create(RedditAPI.class);
private static final String TAG = "FragmentHome";
private RecyclerView feedRecyclerView;
private List<ChildrenData> childrenData;
private String after;
private String previousAfter = "";
private Boolean isScrolling = false;
private int currentItems;
private int totalItems;
private int scrolledOutItems;
private Context context;
private View inflatingView;
public FragmentHome() {
}
public FragmentHome(Context context) {
this.context = context; //I also get some attribute warning
here not important right now though.
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
inflatingView = inflater.inflate(R.layout.fragment_home, container, false);
initRecyclerView();
return inflatingView;
}
public void initGetData() {
Call<FeedData> feedDataCall = redditAPI.getFeed();
feedDataCall.enqueue(new Callback<FeedData>() {
@Override
public void onResponse(Call<FeedData> call, final Response<FeedData> response) {
/* Log.d(TAG, "onResponse: " + response.body().getData().getChildren().get(0).getDataModel().getTitle());
Log.d(TAG, "onResponse: " + response.body().getData().getChildren());*/
childrenData = response.body().getData().getChildren();
Log.d(TAG, "onResponse: " + childrenData);
after = response.body().getData().getAfter();
Log.d(TAG, "onResponse: " + after);
}
@Override
public void onFailure(Call<FeedData> call, Throwable t) {
Log.d(TAG, "onFailure: " + t.getMessage());
}
});
}
public void initRecyclerView() {
feedRecyclerView = inflatingView.findViewById(R.id.recyclerView);
final FeedRecyclerViewAdapter feedRecyclerViewAdapter = new FeedRecyclerViewAdapter(childrenData, context);
feedRecyclerView.setAdapter(feedRecyclerViewAdapter);
final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
feedRecyclerView.setLayoutManager(linearLayoutManager);
feedRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
isScrolling = true;
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
currentItems = linearLayoutManager.getChildCount();
totalItems = linearLayoutManager.getItemCount();
scrolledOutItems = linearLayoutManager.findFirstVisibleItemPosition();
if (isScrolling && (totalItems - 1 == currentItems + scrolledOutItems) && (!previousAfter.equals(after))) {
isScrolling = false;
fetchNewData(after, feedRecyclerViewAdapter);
}
}
});
}
public void fetchNewData(final String after_use, final FeedRecyclerViewAdapter feedRecyclerViewAdapter) {
Call<FeedData> feedDataCall_withAfter = redditAPI.getFeed_withAfter(after_use);
previousAfter = after_use;
feedDataCall_withAfter.clone().enqueue(new Callback<FeedData>() {
@Override
public void onResponse(Call<FeedData> call, Response<FeedData> response) {
Log.d(TAG, "onResponse: " + response.body().toString());
childrenData.addAll(response.body().getData().getChildren());
after = response.body().getData().getAfter();
feedRecyclerViewAdapter.notifyDataSetChanged();
}
@Override
public void onFailure(Call<FeedData> call, Throwable t) {
}
});
Log.d(TAG, "fetchNewData: " + childrenData.size());
}
}
公共类FragmentHome扩展了Fragment{
专用字符串BASE_URL=”https://www.reddit.com";
//初始化改装并一次性呼叫
改装改装=新改装.Builder()
.baseUrl(基本URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
RedditAPI RedditAPI=reformation.create(RedditAPI.class);
私有静态最终字符串标记=“FragmentHome”;
私人RecyclerView feedRecyclerView;
私有列表childrenData;
私有字符串之后;
私有字符串previousAfter=“”;
私有布尔isScrolling=false;
私人物品;
私人物品;
私有int-scrolledOutItems;
私人语境;
私有视图膨胀视图;
公共家庭(){
}
公共碎片主页(上下文){
this.context=context;//我还得到一些属性警告
不过现在这里并不重要。
}
@可空
@凌驾
创建视图时的公共视图(@NonNull LayoutInflater inflater、@Nullable ViewGroup container、@Nullable Bundle savedInstanceState){
充气视图=充气机。充气(R.layout.fragment\u home,container,false);
initRecyclerView();
返回膨胀视图;
}
public void initGetData(){
调用feedDataCall=redditAPI.getFeed();
enqueue(新的回调函数(){
@凌驾
公共void onResponse(呼叫、最终响应){
/*Log.d(标记“onResponse:+response.body().getData().getChildren().get(0.getDataModel().getTitle());
Log.d(标记“onResponse:+response.body().getData().getChildren())*/
childrenData=response.body().getData().getChildren();
Log.d(标记“onResponse:+childrenData”);
after=response.body().getData().getAfter();
Log.d(标签“onResponse:”+之后);
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
Log.d(标记“onFailure:+t.getMessage());
}
});
}
public void initRecyclerView(){
feedRecyclerView=膨胀视图.findViewById(R.id.recyclerView);
最终FeedRecycleServiceAdapter FeedRecycleServiceAdapter=新的FeedRecycleServiceAdapter(childrenData,上下文);
FeedRecycleView.setAdapter(FeedRecycleWebAdapter);
最终LinearLayoutManager LinearLayoutManager=新的LinearLayoutManager(上下文);
feedRecyclerView.setLayoutManager(linearLayoutManager);
feedRecyclerView.addOnScrollListener(新的RecyclerView.OnScrollListener(){
@凌驾
CrollStateChanged上的公共void(@NonNull RecyclerView RecyclerView,int newState){
super.onScrollStateChanged(recyclerView、newState);
isScrolling=true;
}
@凌驾
已克隆的公共void(@NonNull RecyclerView RecyclerView,int-dx,int-dy){
super.onScrolled(recyclerView、dx、dy);
currentItems=linearLayoutManager.getChildCount();
totalItems=linearLayoutManager.getItemCount();
scrolledOutItems=linearLayoutManager.findFirstVisibleItemPosition();
如果(isScrolling&&(totalItems-1==currentItems+scrolledOutItems)&(!previousAfter.equals(after))){
IsCrolling=假;
fetchNewData(FeedRecycleServiceAdapter之后);
}
}
});
}
public void fetchNewData(使用后的最终字符串,final feedRecycleServiceAdapter feedRecycleServiceAdapter){
调用feedDataCall_withAfter=redditAPI.getFeed_withAfter(使用后);
previousAfter=使用后;
feedDataCall_withAfter.clone().enqueue(新回调()命令){
@凌驾
公共void onResponse(调用、响应){
Log.d(标记“onResponse:+response.body().toString());
addAll(response.body().getData().getChildren());
after=response.body().getData().getAfter();
FeedRecycleServiceAdapter.notifyDataSetChanged();
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
}
});
Log.d(标记“fetchNewData:+childrenData.size());
}
}
我收到的错误
我得到以下错误:
2019-04-15 13:00:28.449 18359-18359/com.example.recyclererview2e/AndroidRuntime:致命异常:main
进程:com.example.recyclererview2,PID:18359
java.lang.RuntimeException:无法启动activity ComponentInfo{com.example.recyclerview2/com.example.recyclerview2.MainActivity}:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法android.view.android.view.view.findViewById(int)
StackTrace
2019-04-15 13:57:00.234 5508-5508/com.example.recyclererview2e/AndroidRuntime:致命异常:main
进程:com.example.recyclererview2,PID:5508
java.lang.RuntimeException:无法启动activity ComponentInfo{com.example.recyclerview2/com.example.recyclerview2.MainActivity}:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.view.view android.view.view.findViewById(int)”
位于android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java