首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android Fragment setAdapter 空指針:Adapter 初始化時機與 View 綁定順序

     編輯:程式設計綜合問答

錯誤現場


@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    newsList = getNews();           // 返回 null!方法末尾 return newsList 但 newsList 未賦值
    adapter = new NewsAdapter(activity, R.layout.news_item, newsList);
}

根因

getNews() 方法中 return newsList; 但 newsList 為成員變量,方法內新建了局部 newslist 並 add 到局部變量,成員變量 newsList 仍為 null → Adapter 內部持有 null 列表 → getCount() 拋 NPE。

修復


public List getNews() {
    List list = new ArrayList<>(); // 局部變量
    News n1 = new News(); n1.setTitle("..."); list.add(n1);
    News n2 = new News(); n2.setTitle("..."); list.add(n2);
    return list; // 返回局部列表
}

// onCreateView 中設置 Adapter(View 已創建)
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.news_title_frag, container, false);
    titleListView = view.findViewById(R.id.title_list);
    adapter = new NewsAdapter(getActivity(), R.layout.news_item, getNews()); // 這裡初始化
    titleListView.setAdapter(adapter);
    return view;
}

最佳實踐

  • 數據加載放 onCreate 或 onViewCreated,而非 onAttach。
  • Adapter 構造傳入非空集合(new ArrayList<>() 兜底)。
  • 異步加載數據時,先 setAdapter(new Adapter(emptyList)),數據到達後 adapter.notifyDataSetChanged()。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved