简体   繁体   English

我无法将数据传递到我的回收站视图

[英]I'm having trouble passing the data to my recycler view

I am having trouble passing the data to my recycle view.我无法将数据传递到我的回收视图。 The data is taken in the firebase , but when I try to pass through ( post= d.getValue(Post.class) ) the null value is passed, but the variable d holds the data from the firebase .的数据被取入的firebase ,但是当我试图通过( post= d.getValue(Post.class)的空值被传递,但变量d从保存数据firebase I always get a NullPointerException .我总是得到一个NullPointerException

My FRAGMENT我的碎片

    public class HomeFragment extends Fragment {
    // Components
    RecyclerView rv_posts;
    private FancyButton mBtAnunciar;
    // Vars
    List<Post> postsList;
    // Utils
    PostAdapter postAdapter;
    SharedPreferences sharedPreferences;
    // Firebase Utils
    private DatabaseReference mdataRef;
    private SearchView searchView;

    public HomeFragment() {
        // Required empty public constructor
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Init Main
        View view = inflater.inflate(R.layout.fragment_home, container, false);
        // Setup Utils
        sharedPreferences = getActivity().getSharedPreferences("maisVidaSP", Context.MODE_PRIVATE);
        rv_posts = view.findViewById(R.id.rv_posts);
        rv_posts.setHasFixedSize(true);
        // Init Components
        searchView  = view.findViewById(R.id.pesquisar);
        mBtAnunciar = view.findViewById(R.id.btn_anunciar);
        postsList = new ArrayList<Post>();
        // Setup Components
        mBtAnunciar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
                AnuncioFragment anuncioFragment = new AnuncioFragment();
                fragmentManager.beginTransaction().replace(R.id.fl_framelayout, anuncioFragment).commit();
            }
        });
        // Setup RecyclerView
        if (getActivity() != null){
            rv_posts.setLayoutManager(new CustomLinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL,false)); // set the list layout style to vertical.
            postAdapter = new PostAdapter(getActivity(), postsList);
            rv_posts.setAdapter(postAdapter);
        }
        // get the user's UID
        FirebaseAuth firebaseAuth = ConfiguracaoFirebase.getFirebaseAuth();
        String uid = firebaseAuth.getUid();
        mdataRef = ConfiguracaoFirebase.getFirebase();
        mdataRef.child("Usuario").orderByChild("disponibilidade").equalTo("Sim").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                Post post = new Post();
               for (DataSnapshot d: dataSnapshot.getChildren()){
                   post= d.getValue(Post.class);
                    Log.i("MV","AQUI"+post);
                }
                postsList.add(post);
                postAdapter.notifyDataSetChanged();
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                // todo: remove on production...
                Toast.makeText(getContext(), "Bugged", Toast.LENGTH_SHORT).show();
            }
        });
        return view;
    }
    public class CustomLinearLayoutManager extends LinearLayoutManager {
        public CustomLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
            super(context, orientation, reverseLayout);
        }
    }

}

My class adapter我的类适配器

    public class PostAdapter extends RecyclerView.Adapter<PostAdapter.PostViewHolder> {

    private List<Post> mPostsList;
    public Context mContext;
    private AdapterView.OnItemClickListener onItemClickListener;

    public PostAdapter(Context context, List<Post> postsList) {
        mContext = context;
        mPostsList = postsList;
    }
    @Override
    public PostViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        View view = inflater.inflate(R.layout.posts_list, viewGroup, false);
        return new PostViewHolder(view, mContext);
    }
    @Override
    public void onBindViewHolder(@NonNull PostViewHolder holder, final int position) {
        if ((mPostsList != null) && (mPostsList.size() >0)) {
            Post post = mPostsList.get(position);
            holder.tv_nome.setText(post.nome);
            holder.tv_provincia.setText(post.provincia);
            setChipTextAndBackground(holder.tv_estado, post.getEstado());
             holder.mli_tipoSangue.setLetter(post.getTipoSanguineo());
        }
    }
    @Override
    public int getItemCount() {
        return mPostsList.size();
    }

    public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

    public void onItemHolderClick(PostViewHolder holder) {
        if (onItemClickListener != null) {
            onItemClickListener.onItemClick(null, holder.itemView, holder.getAdapterPosition(), holder.getItemId());
        }
    }
    class PostViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private PostAdapter mAdapter;
        MaterialLetterIcon mli_tipoSangue;
        TextView tv_nome, tv_data, tv_provincia;
        Chip tv_estado;
        public PostViewHolder(View itemView, final Context context) {
            super(itemView);
            this.mAdapter = mAdapter;
            mli_tipoSangue = itemView.findViewById(R.id.mli_tipoSangue);
            tv_nome = itemView.findViewById(R.id.tv_nome);
            tv_data = itemView.findViewById(R.id.tv_data);
            tv_estado = itemView.findViewById(R.id.tv_estado);
            tv_provincia = itemView.findViewById(R.id.tv_provincia);
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(context, PostDetailsActivity.class);
                    ((AppCompatActivity) context).startActivityForResult(intent, 0);
                }
            });
        }
        public void setStudentToList(Post item, int position) {
        }
        @Override
        public void onClick(View v) {

        }
    }
    private void setChipTextAndBackground(Chip v, String estado){
        String est = estado.toLowerCase();
        v.setChipText(estado.toUpperCase());
        switch (est){
            case "Doador":
                v.setBackgroundResource(R.color.md_grey_800);
                break;
            case "Requisitante":
                v.setBackgroundResource(R.color.md_grey_600);
                break;
            default:
                v.setBackgroundResource(R.color.md_blue_900);
                break;
        }
    }
}

my database struct JSON我的数据库结构 JSON

enter image description here在此处输入图片说明

In your example you add to the local copy of the list and not the one stored in your PostAdapter .在您的示例中,您添加到列表的本地副本,而不是存储在PostAdapter中的PostAdapter

Post post = new Post();
for (DataSnapshot d: dataSnapshot.getChildren()){
    post= d.getValue(Post.class);
    Log.i("MV","AQUI"+post);
}
postsList.add(post);// <----------
postAdapter.notifyDataSetChanged();

Notice on that line that the postsList isn't stored in the PostAdapter , but in your HomeFragment .请注意,在该行中, postsList未存储在PostAdapter ,而是存储在HomeFragment

In order to fix this, either make postAdapter.mPostsList not private and edit the field directly instead of the copy in the HomeFragment , or add the value via a method, eg postAdapter.addPost(post)为了解决这个问题,要么使postAdapter.mPostsList不是私有的并直接编辑该字段而不是HomeFragment中的副本,要么通过一个方法添加值,例如postAdapter.addPost(post)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM