【问题标题】:Recycler List Adapter is null after initialization初始化后回收站列表适配器为空
【发布时间】:2018-04-27 08:51:13
【问题描述】:

我的应用有一个包含三个片段的标签栏。在onCreate 方法中,我调用了一个名为initPlantList 的函数。这个函数初始化我的 RecyclerListAdapter。

private void initPlantList(){
    RecyclerView rV = findViewById(R.id.plantsRecycler);
    PlantListAdapter pLA = new PlantListAdapter(this);
    Log.d("PLA", pLA.hasContext());
    rV.setAdapter(pLA);
    rV.setLayoutManager(new LinearLayoutManager(this));
}

当我尝试调用 rV.setAdapter(pLA); 时收到此错误 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView$Adapter)' on a null object reference 这是我的适配器类

public class PlantListAdapter extends 
RecyclerView.Adapter<PlantListAdapter.ViewHolder>{

    private static final String TAG = "PlantListAdapter";

    private Context mContext;

    public PlantListAdapter(Context c){
        this.mContext = c;
    }

    public String hasContext(){
        if(this.mContext != null){
            return mContext.getPackageResourcePath();
        }
        return "false";
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layoutplantlist, parent, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    Log.d(TAG, "onBindViewHolder: called.");

    holder.image.setImageDrawable(MyApplication.myPlantList.get(position).getImage());

holder.plantName.setText(MyApplication.myPlantList.get(position).getName());
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder{

        CircleImageView image;
        TextView plantName;
        RelativeLayout plantListItem;

        public ViewHolder(View itemView) {
            super(itemView);
            image = itemView.findViewById(R.id.plantImage);
            plantName = itemView.findViewById(R.id.plantName);
            plantListItem = itemView.findViewById(R.id.plantListItem);
        }
    }
}

对为什么将pLA 称为null object reference 有任何想法吗?

【问题讨论】:

  • findViewById in Fragment的可能重复
  • 也许“rV”为空。
  • 不是Adapter。 RecyclerView rV 为空。如果RecyclerView 在Fragment 中,您应该在Fragment 中处理它,而不是Activity。
  • 我认为你的 RecycleView id 不匹配。

标签: java android android-fragments android-recyclerview


【解决方案1】:

不是你的适配器是空的。它是您的 Recyclerview。您正在使用一个片段,因此您不能使用 (findViewById)。 您必须使用膨胀的视图找到它。 试试这个:

private void initPlantList(View v){
RecyclerView rV = v.findViewById(R.id.plantsRecycler);
PlantListAdapter pLA = new PlantListAdapter(this);
Log.d("PLA", pLA.hasContext());
rV.setAdapter(pLA);
rV.setLayoutManager(new LinearLayoutManager(this));

}

当您在片段 onCrrateView() 中调用该方法时,只需将视图作为参数传递。 希望对你有帮助

【讨论】:

  • 这很有帮助。问题是,我在Fragment.getItem(int position) 中打电话给initPlantList()。我只希望在单击 leftMost 选项卡时调用此函数,因此我将它放在 case 0: 中的 switch (position) 中。这里没有视图供我传入。有没有办法将initPlantList() 移动到onCreateView() 并保留此功能?编辑:我尝试将其移至onCreateView,但我无法这样做,因为PlantListAdapter 构造函数需要创建上下文,而无法创建static(onCreateView 是static)
  • 你有三个片段。这意味着你有三个布局每个片段都有自己的视图,它在其中膨胀。因此,将与该片段相关的所有代码放在该片段中。为了获得更好的帮助,你也可以向你展示片段类吗?还有填充这些片段的活动。然后我会编辑我的答案没问题
  • 我明白,我将initPlantList 函数移到它自己的片段类中,而不是仅仅将它留在mainactivity 中,一切都很好。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
  • 2018-07-15
  • 2015-08-04
  • 2018-12-13
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多