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

时间:2018-11-06 20:43:38

标签: java android firebase android-studio

我无法将数据传递到回收视图。数据是在firebase中获取的,但是当我尝试通过(post= d.getValue(Post.class))时,会传递空值,但是变量d会保存来自firebase的数据。我总是得到NullPointerException

我的片段

    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);
        }
    }

}

我的班级适配器

    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;
        }
    }
}

我的数据库结构JSON

enter image description here

1 个答案:

答案 0 :(得分:0)

在您的示例中,您将添加到列表的本地副本,而不是存储在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();

请注意,该行postsList不会存储在PostAdapter中,而是存储在您的HomeFragment中。

要解决此问题,请将postAdapter.mPostsList设置为非私有并直接编辑字段而不是HomeFragment中的副本,或者通过方法(例如postAdapter.addPost(post)