回收站视图不显示任何项目 [英] Recycler View doesn't show any item

查看:66
本文介绍了回收站视图不显示任何项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to display contacts in a Fragment but the recycler view doesn't show any item. Despite having items in the list recycler view is not showing any item. I am not sure what I have done wrong as the app does not crash when it is running.

以下是代码

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 表示有一个项目.

In the Log statement, it is showing actual:1 that means there is an item.

这是适配器代码

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

知道为什么会这样吗?

推荐答案

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

Strangely, I've faced this issue very recently and I was using as global List variable as well and the list wasn't empty, even the adpater was not empty but RecyclerView wasn't showing any data until second adpater.notifyDataSetchanged().

我在此网站上找到了一个答案,说创建新的列表变量".而且有效.

I'd found an answer here on this site that said "create a new list variable" and it worked.

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

Try making the actualUserList a local variable as in your 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);
    }
}

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

If this doesn't solve your problem, you can also try calling notifyDataSetChanged() after setting up the adapter as adapter.notifyDataSetChanged();.

此外,在 onCreatedView()中设置适配器,然后在此 onDataChange()中调用 adapter.notifyDataSetChanged().

Also, set the adapter in onCreatedView() and call adapter.notifyDataSetChanged() in this onDataChange().

这篇关于回收站视图不显示任何项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆