我无法将数据传递到回收视图。数据是在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
答案 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)