回收者视图不显示任何项目

时间:2020-07-27 09:00:05

标签: java android android-recyclerview

我正在尝试在片段中显示联系人,但是recycler view没有显示任何项目。尽管列表回收器中有项目,但视图未显示任何项目。我不确定自己做错了什么,因为该应用程序在运行时不会崩溃。

以下是代码

public class UsersFragment extends Fragment {

    RecyclerView recyclerView;
    UsersAdapter adapter;
    List<Users> actualuserList;
    List<String> contactsList;
    DatabaseReference reference;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_users, container, false);

        recyclerView = view.findViewById(R.id.userRecyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

        contactsList = new ArrayList<>();
        actualuserList = new ArrayList<>();


        return view;
    }


    private void getContactList() {
        Cursor cursor = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                null, null, null,
                ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
        while (cursor.moveToNext()) {
            String phone = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            if (contactsList.contains(phone)) {
                cursor.moveToNext();
            } else {
                contactsList.add(phone);
            }
        }
        getActualUser();
        Log.d("contact: ", String.valueOf(contactsList.size()));

    }

    private void getActualUser() {
        reference = FirebaseDatabase.getInstance().getReference().child("Users");
        for (String number : contactsList) {
            Query query = reference.orderByChild("phoneNumber").equalTo(number);
            query.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    actualuserList.clear();
                    if (snapshot.exists()) {
                        for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
                            Users user = dataSnapshot.getValue(Users.class);
                            actualuserList.add(user);
                        }
                        Log.d("actual: ", String.valueOf(actualuserList.size()));
                        adapter = new UsersAdapter(getContext(), actualuserList);
                        recyclerView.setAdapter(adapter);
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {

                }
            });
        }
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        getContactList();
    }
}

在Log语句中,显示actual:1表示有一个项目。

这是适配器代码

public class UsersAdapter extends RecyclerView.Adapter<UsersAdapter.ViewHolder> {
    Context mContext;
    List<Users> mList;

    public UsersAdapter(Context mContext, List<Users> mList) {
        this.mContext = mContext;
        this.mList = mList;
    }

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

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
        final Users users = mList.get(position);
        holder.name.setText(users.getUsername());
        holder.number.setText(users.getPhoneNumber());
        String url = users.getProfilephotoURL();
        if (url.equals(""))
            holder.circleImageView.setImageResource(R.drawable.ic_user);
        else
            Glide.with(mContext).load(url).into(holder.circleImageView);
        holder.itemView.setOnClickListener(v -> {
            Intent intent = new Intent(mContext, ChatActivity.class);
            intent.putExtra("name", users.getUsername());
            intent.putExtra("firendPhoneNumber", users.getPhoneNumber());
            mContext.startActivity(intent);
        });
    }

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

    static class ViewHolder extends RecyclerView.ViewHolder {
        TextView name, number;
        CircleImageView circleImageView;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            name = itemView.findViewById(R.id.contactName);
            number = itemView.findViewById(R.id.contactNumber);
            circleImageView = itemView.findViewById(R.id.profilePic);
        }
    }
}

日志

2020-07-27 14:52:51.651 25366-25366/com.mycompany.newchatapp D/contact:: 167

2020-07-27 14:52:51.670 25366-25366/com.mycompany.newchatapp E/RecyclerView: No adapter attached; skipping layout

2020-07-27 14:52:51.691 25366-25366/com.mycompany.newchatapp W/ClassMapper: No setter/field for status found on class com.mycompany.newchatapp.Model.Users

2020-07-27 14:52:51.691 25366-25366/com.mycompany.newchatapp D/actual:: 1

2020-07-27 14:52:51.723 25366-25366/com.mycompany.newchatapp W/ClassMapper: No setter/field for status found on class com.mycompany.newchatapp.Model.Users

2020-07-27 14:52:51.723 25366-25366/com.mycompany.newchatapp D/actual:: 1

知道为什么会这样吗?

2 个答案:

答案 0 :(得分:2)

好像您忘记设置适配器了。

onCreateView方法中输入如下内容:

recyclerView.setAdapter(new UsersAdapter(this.getActivity(), getContactList()));

UPD: 在此之前,使getContactList()返回相关的数据集。初始化回收者视图后,请勿设置适配器。

答案 1 :(得分:1)

奇怪的是,我最近遇到了这个问题,我也使用了全局List变量,并且列表也不为空,即使adpater也为空,但RecyclerView直到显示任何数据第二adpater.notifyDataSetchanged()

我在此网站上找到了一个答案,说“创建一个新的列表变量”并且有效。

请像在actualUserList中一样,将onDataChange()设置为局部变量,

public void onDataChange(@NonNull DataSnapshot snapshot) {
    List<Users> actualuserList = new ArrayList<>();
    if (snapshot.exists()) {
        for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
            Users user = dataSnapshot.getValue(Users.class);
            actualuserList.add(user);
        }
        Log.d("actual: ", String.valueOf(actualuserList.size()));
        adapter = new UsersAdapter(getContext(), actualuserList);
        recyclerView.setAdapter(adapter);
    }
}

如果这不能解决您的问题,您也可以在将适配器设置为notifyDataSetChanged()之后尝试调用adapter.notifyDataSetChanged();

还要在onCreatedView()中设置适配器,并在此adapter.notifyDataSetChanged()中调用onDataChange()