【问题标题】:Context - null object reference [duplicate]上下文 - 空对象引用
【发布时间】:2018-12-31 06:40:59
【问题描述】:

我有带有 RecyclerView 适配器的 Fragment。 我也有月份数组和包含的帖子数组对象。

我尝试动态添加帖子表行。我不知道它应该怎么做。

public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.NewsCardViewHolder> {

private List<NewsMonth> months;
private List<NewsPost> posts;
private AdapterView.OnItemClickListener onItemClickListener;
private String TAG = "NewsAdapter";
private Context _context;
TableLayout tableLayout;

public NewsAdapter(List<NewsMonth> months, Context context) {
    this.months = months;
    this._context = context;
}

class NewsCardViewHolder extends RecyclerView.ViewHolder {
    CardView cv;
    TextView monthName;
    TextView postLabel;
    TextView postType;
    TableLayout tableLayout;

    NewsCardViewHolder(View itemView) {
        super(itemView);
        cv = itemView.findViewById(R.id.cv);
        monthName = itemView.findViewById(R.id.month_name);
        postLabel = itemView.findViewById(R.id.news_label);
        postType = itemView.findViewById(R.id.news_category);
        tableLayout = itemView.findViewById(R.id.tableNews);
    }
}

@NonNull
@Override
public NewsCardViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.news_item, viewGroup, false);
    return new NewsCardViewHolder(v);
}

@Override
public void onBindViewHolder(@NonNull NewsCardViewHolder ViewHolder, final int position) {
    ViewHolder.monthName.setText(months.get(position).getMonthName());
    posts = months.get(position).getPosts();
    for (int j = 0; j < posts.size(); j++) {
        //ViewHolder.itemView.addView(months.get(position).getPosts().get(j).getTitle());
        TextView postLabel = new TextView(_context.getApplicationContext());
        postLabel.setGravity(Gravity.START);
        postLabel.setText(months.get(position).getPosts().get(j).getTitle());
        postLabel.setLayoutParams(new TableRow.LayoutParams
                (LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
        postLabel.setTextSize(10);
        postLabel.setTextColor(Color.parseColor("#FF9900"));
        TableRow row = new TableRow(_context.getApplicationContext());
        row.addView(postLabel);
        tableLayout.addView(row);
    }
}

在活动开始时,我得到:java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on an null object reference行:TextView postLabel = new TextView...

编辑:

public class NewsFragment extends Fragment{

private List<NewsMonth> monthArray;
private List<NewsPost> postArray;
private TableLayout tableLayout;

public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    return inflater.inflate(R.layout.news_fragment, container, false);
}

@Override
public void onViewCreated(@NonNull View view,
                          Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ViewPager viewPager = view.findViewById(R.id.view_pager);
    tableLayout = view.findViewById(R.id.tableNews);
    ImageSliderAdapter sliderAdapter = new ImageSliderAdapter(getContext());
    viewPager.setAdapter(sliderAdapter);
    initializeData();
    RecyclerView recyclerView = view.findViewById(R.id.newsList);
    recyclerView.setNestedScrollingEnabled(false);
    recyclerView.setHasFixedSize(false);
    recyclerView.setLayoutManager(new LinearLayoutManager(this.getActivity())); //getActivity(), LinearLayoutManager.VERTICAL, false
    NewsAdapter adapter = new NewsAdapter(monthArray, getContext());
    recyclerView.setAdapter(adapter);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
}

【问题讨论】:

  • 永远不会设置你的 _context

标签: android android-recyclerview tablelayout android-viewholder


【解决方案1】:

我认为您需要正确设置 _context。将 Activity 的上下文传递给适配器,然后将 _context 设置为正在传递的上下文。

public NewsAdapter(List<NewsMonth> months, Context context) {
    this.months = months;
    _context = context;
}

【讨论】:

  • 现在这个错误:空对象引用上的 TableLayout.addView(android.view.View)'
  • 您的适配器是从片段中调用的,因此可以确定您对活动上下文有正确的引用
  • 是的,由这一行调用: NewsAdapter adapter = new NewsAdapter(monthArray, getContext());我编辑问题
  • 你需要把 this.getActivity() insted of getContext
  • addView 上仍然为空
猜你喜欢
  • 2018-06-27
  • 2017-12-28
  • 2016-10-28
  • 2017-01-09
  • 2016-06-04
  • 2015-04-15
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多