You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用RecyclerView+CardView展示联系人遇空指针错误求助

解决RecyclerView空指针错误:Attempt to invoke virtual method 'setLayoutManager' on null object reference

嘿,我马上就发现你代码里的问题啦!这个空指针错误的根源很典型,咱们一步步来解决:

核心问题:找错了RecyclerView的上下文

你在Fragment的onCreateView里用了:

recyclerView = (RecyclerView) getActivity().findViewById(R.id.recycler_view);

getActivity().findViewById()是从宿主Activity的布局里查找控件,但你的recycler_view明明在Fragment自己的contact_list_fragment.xml布局里!所以这个调用会返回null,后续调用setLayoutManager自然就抛出空指针了。

修复方案

1. 正确获取Fragment布局里的RecyclerView

应该用你inflate出来的Fragment视图对象contact_fragment来调用findViewById:

recyclerView = (RecyclerView) contact_fragment.findViewById(R.id.recycler_view);

2. 补充两个重要优化(避免后续踩坑)

  • 关闭Cursor避免内存泄漏:查询完联系人后,一定要关闭Cursor,不然会占用资源:
    if (cursor != null) {
        cursor.close();
    }
    
  • 动态申请联系人权限:Android 6.0(API 23)及以上版本,读取联系人需要动态申请READ_CONTACTS权限,不然Cursor会是空的,你的列表也不会显示数据。可以在Fragment的onCreate方法里添加权限申请逻辑:

修正后的完整Contact_List_Fragment.java代码

public class Contact_List_Fragment extends android.support.v4.app.Fragment {
    RecyclerView recyclerView;
    ArrayList<String> contact_names = new ArrayList<>(), mobile_numbers = new ArrayList<>();

    public Contact_List_Fragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 动态申请联系人权限
        if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_CONTACTS)
                != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, 100);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View contact_fragment = inflater.inflate(R.layout.contact_list_fragment, container, false);
        
        // 正确从Fragment布局中获取RecyclerView
        recyclerView = (RecyclerView) contact_fragment.findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setAdapter(new RecyclerAdapter(contact_names, mobile_numbers));

        // 如果权限已授予,加载联系人
        if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_CONTACTS)
                == PackageManager.PERMISSION_GRANTED) {
            loadContacts();
        }

        return contact_fragment;
    }

    private void loadContacts() {
        String[] PROJECTION_MAIN = new String[]{
                ContactsContract.Contacts._ID,
                ContactsContract.CommonDataKinds.Phone.NUMBER,
                ContactsContract.Contacts.DISPLAY_NAME
        };
        Cursor cursor = getActivity().getContentResolver().query(
                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                PROJECTION_MAIN, null, null, null);
        if (cursor != null) {
            contact_names.clear();
            mobile_numbers.clear();
            while (cursor.moveToNext()) {
                String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                String phone = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                contact_names.add(name);
                mobile_numbers.add(phone);
            }
            cursor.close();
            recyclerView.getAdapter().notifyDataSetChanged();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 100 && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            loadContacts();
        }
    }
}

额外小提示

你的recycler_item_layout.xml里,LinearLayout嵌套了CardView,CardView又嵌套了RelativeLayout,布局层级有点深,可以适当简化,比如直接用CardView作为根布局,这样能提升一点性能哦~

内容的提问来源于stack exchange,提问作者Keyur Sureliya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:31:41