[英]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
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.