Java RecyclerView试图对空对象引用调用虚拟方法getItemCount()
我试图在一个片段中使用recyclerview,我在一个项目中使用了recyclerview,它在一个活动中工作得非常完美,直到我尝试在另一个片段项目中实现它。我尝试将两者结合起来,但出现以下错误: LinearLayoutManager.getItemCount()上的NullPointerException 什么可能导致NullPointerExceptionJava RecyclerView试图对空对象引用调用虚拟方法getItemCount(),java,android,android-fragments,android-recyclerview,tabs,Java,Android,Android Fragments,Android Recyclerview,Tabs,我试图在一个片段中使用recyclerview,我在一个项目中使用了recyclerview,它在一个活动中工作得非常完美,直到我尝试在另一个片段项目中实现它。我尝试将两者结合起来,但出现以下错误: LinearLayoutManager.getItemCount()上的NullPointerException 什么可能导致NullPointerException Process: com.example.accueil, PID: 23897 java.lang.NullPointer
Process: com.example.accueil, PID: 23897
java.lang.NullPointerException: Attempt to invoke virtual method 'int androidx.recyclerview.widget.LinearLayoutManager.getItemCount()' on a null object reference
at com.example.accueil.Adapter.MyAdapter$1.onScrolled(MyAdapter.java:72)
at androidx.recyclerview.widget.RecyclerView.dispatchOnScrolled(RecyclerView.java:4961)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep3(RecyclerView.java:4021)
at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3652)
at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4194)
at android.view.View.layout(View.java:16022)
at android.view.ViewGroup.layout(ViewGroup.java:5181)
at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1915)
at android.view.View.layout(View.java:16022)
at android.view.ViewGroup.layout(ViewGroup.java:5181)
at androidx.viewpager.widget.ViewPager.onLayout(ViewPager.java:1775)
at android.view.View.layout(View.java:16022)
at android.view.ViewGroup.layout(ViewGroup.java:5181)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1959)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1813)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1722)
at android.view.View.layout(View.java:16022)
at android.view.ViewGroup.layout(ViewGroup.java:5181)
at androidx.drawerlayout.widget.DrawerLayout.onLayout(DrawerLayout.java:1231)
at android.view.View.layout(View.java:16022)
at android.view.ViewGroup.layout(ViewGroup.java:5181)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:639)
at android.widget.FrameLayout.onLayout(FrameLayout.java:574)
at android.view.View.layout(View.java:16022)
at android.view.ViewGroup.layout(ViewGroup.java:5181)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1959)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1813)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1722)
at android.view.View.layout(View.java:16022)
at android.view.ViewGroup.layout(ViewGroup.java:5181)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:639)
at android.widget.FrameLayout.onLayout(FrameLayout.java:574)
at android.view.View.layout(View.java:16022)
at android.view.ViewGroup.layout(ViewGroup.java:5181)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1959)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1813)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1722)
at android.view.View.layout(View.java:16022)
at android.view.ViewGroup.layout(ViewGroup.java:5181)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:639)
at android.widget.FrameLayout.onLayout(FrameLayout.java:574)
at android.view.View.layout(View.java:16022)
at android.view.ViewGroup.layout(ViewGroup.java:5181)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2483)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2180)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1292)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6598)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:800)
at android.view.Choreographer.doCallbacks(Choreographer.java:603)
at android.view.Choreographer.doFrame(Choreographer.java:572)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:786)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5631)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
这是我的密码:
MyAdapter.java:
class LoadingViewHolder extends RecyclerView.ViewHolder
{
public ProgressBar progressBar;
public LoadingViewHolder( View itemView) {
super(itemView);
progressBar= (ProgressBar) itemView.findViewById(R.id.progressBar);
}
}
class ItemViewHolder extends RecyclerView.ViewHolder{
public TextView title,pub_date;
public ImageView thumbnail;
public ItemViewHolder( View itemView) {
super(itemView);
title=(TextView) itemView.findViewById(R.id.txtName);
pub_date=(TextView) itemView.findViewById(R.id.txtLength);
thumbnail = (ImageView) itemView.findViewById(R.id.thumbnail);
}
}
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private final int VIEW_TYPE_ITEM=0,VIEW_TYPE_LOADING=1;
IloadMore loadMore;
boolean isLoading;
Activity activity;
List<Item> items;
int visibleThreshold=5;
int LastVisibleItem,totalItemCount;
RequestOptions option;
public MyAdapter(RecyclerView recyclerView,Activity activity, List<Item> items) {
this.activity = activity;
this.items = items;
// Request option for Glide
option = new RequestOptions().centerCrop().placeholder(R.drawable.loading_shape).error(R.drawable.loading_shape);
final LinearLayoutManager linearLayoutManager=(LinearLayoutManager) recyclerView.getLayoutManager();
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled( RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
totalItemCount= linearLayoutManager.getItemCount();
LastVisibleItem=linearLayoutManager.findLastVisibleItemPosition();
if (!isLoading && totalItemCount <= (LastVisibleItem + visibleThreshold) )
{
if(loadMore!=null) {
loadMore.onLoadMore();
isLoading = true;
}
}
}
});
}
@Override
public int getItemViewType(int position) {
return items.get(position)==null ?VIEW_TYPE_LOADING:VIEW_TYPE_ITEM;
}
public void setLoadMore(IloadMore loadMore) {
this.loadMore = loadMore;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(viewType == VIEW_TYPE_ITEM)
{
View view =LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_layout,parent,false);
return new ItemViewHolder(view);
}
else if(viewType==VIEW_TYPE_LOADING )
{
View view =LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_loading,parent,false);
return new LoadingViewHolder(view);
}
return null;
}
@Override
public void onBindViewHolder( RecyclerView.ViewHolder holder, int position) {
if (holder instanceof ItemViewHolder)
{
Item item= items.get(position);
ItemViewHolder viewHolder=(ItemViewHolder) holder;
viewHolder.title.setText(items.get(position).getTitle());
viewHolder.pub_date.setText(items.get(position).getDatePub());
/*if(items.get(position).getImage() != null)
Picasso.get().load(items.get(position).getImage()).into(viewHolder.thumbnail);
else*/
Picasso.get().load("https://www.victimeslactalis.fr/wp-content/uploads/2019/01/POURQUOI_DOCTEUR.png").into(viewHolder.thumbnail);
}
else if(holder instanceof LoadingViewHolder)
{
LoadingViewHolder loadingViewHolder =(LoadingViewHolder) holder;
loadingViewHolder.progressBar.setIndeterminate(true);
}
}
@Override
public int getItemCount() {
return items.size();
}
public void setLoaded() {
isLoading = false;
}
}
Tab1.java:
public class tab1 extends Fragment {
List<Item> items= new ArrayList<>();
MyAdapter adapter;
int number, total;
public tab1() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_tab1, container, false);
RecyclerView recycler=(RecyclerView)view.findViewById(R.id.recycler);
//new GetFirstData().execute();
random10Data();
adapter = new MyAdapter(recycler,getActivity(),items);
recycler.setLayoutManager(new LinearLayoutManager(getActivity()));
recycler.setAdapter(adapter);
return view;
}
private void random10Data() {
for (int i=0; i<10;i++)
{
String title = "Static";
String pub_date = "0000";
Item item= new Item("",title,"",pub_date, "");
items.add(item);
}
//new GetData().execute();
}
}
public类tab1扩展了片段{
列表项=新建ArrayList();
MyAdapter适配器;
整数,总数;
公共选项卡1(){
//必需的空公共构造函数
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
视图=充气机。充气(R.layout.fragment_tab1,容器,假);
RecyclerView recycler=(RecyclerView)view.findViewById(R.id.recycler);
//新建GetFirstData().execute();
随机数据();
adapter=新的MyAdapter(回收器,getActivity(),项);
setLayoutManager(新的LinearLayoutManager(getActivity());
回收器。设置适配器(适配器);
返回视图;
}
私有数据(){
对于(int i=0;i而言,主要问题是数据未正确发送到适配器,请确保项目数据正确发送到适配器。
您可以使用以下代码:
int getItemCount(){
return ItemList == null ? 0 : ItemList.size();
}
主要问题在您的fragments onCreateView中:
adapter = new MyAdapter(recycler,getActivity(),items);
recycler.setLayoutManager(new LinearLayoutManager(getActivity()));
因为当调用MyAdapter
构造函数时,并且由于您在其参数中传递recyclerview,所以recyclerview没有设置布局管理器,因此
totalItemCount=linearLayoutManager.getItemCount();
当linearLayoutManager为null时引发NullPointer异常
在您的情况下,最简单的修复方法是在创建适配器之前设置一个布局管理器,如下所示,只需交换它来修复您的问题
recycler.setLayoutManager(new LinearLayoutManager(getActivity()));
adapter = new MyAdapter(recycler,getActivity(),items);
但总的来说,我认为可能还需要其他代码优化。请告诉我这是否有帮助。与您共享MyAdapter.java
classit已经存在您没有发送项目,请调试这行代码:adapter=new MyAdapter(recycler,getActivity(),items);我不确定是否正确,我调试了项,但它不为null,getActivity()返回MainActivity!或者您是指调试它的其他内容?
int getItemCount(){
return ItemList == null ? 0 : ItemList.size();
}
adapter = new MyAdapter(recycler,getActivity(),items);
recycler.setLayoutManager(new LinearLayoutManager(getActivity()));
recycler.setLayoutManager(new LinearLayoutManager(getActivity()));
adapter = new MyAdapter(recycler,getActivity(),items);