Recylerview不会自动从Firebase Android Studio加载数据 [英] Recylerview not automatically loading data from firebase Android Studio
问题描述
我尝试了一切,但是当我打开应用程序时,并没有自动加载firebase中的数据,我必须点击一个edittext来加载数据。
I已尝试
adapter.Update(data);
recycler.invalidate();
notifyDataSetChanged();
adapter.notifyDataSetChanged();
请有人可以帮我一下。
编辑:
我保存到firebase像这样:
public FirebaseHelper(DatabaseReference db){
this.db = db;
//写入如果不是NULL
公共布尔值保存(Spacecraft spacecraft)
{
if(spacecraft == null)
{
saved = false;
} else
{
try
{
db.child(Spacecraft)。push()。setValue(spacecraft);
saved = true;
} catch(DatabaseException e)
{
e.printStackTrace();
saved = false;
}
}
返回保存;
//执行获取数据和填充数组
private void fetchData(DataSnapshot dataSnapshot)
{
spacecrafts.clear(); (DataSnapshot ds:dataSnapshot.getChildren())
{
Spacecraft spacecraft = ds.getValue(Spacecraft.class);
spacecrafts.add(航天器);
}
}
//读取返回值列表
public ArrayList< Spacecraft> (){
db.addChildEventListener(new ChildEventListener(){
@Override $ b $ public void onChildAdded(DataSnapshot dataSnapshot,String s){
fetchData(dataSnapshot);
@Override
public void onChildChanged(DataSnapshot dataSnapshot,String s){
$ b fetchData(dataSnapshot);
}
});
返回航天器;
$ / code $ / pre
$ b $我的viewholder类
public MyViewHolder(View itemView){
super(itemView);
nameTxt =(TextView)itemView.findViewById(R.id.nameTxt);
propTxt =(TextView)itemView.findViewById(R.id.propellantTxt);
descTxt =(TextView)itemView.findViewById(R.id.descTxt);
itemView.setOnClickListener(this);
}
public void setItemClickListener(ItemClickListener itemClickListener)
{
this.itemClickListener = itemClickListener;
}
@Override
public void onClick(View view){
this.itemClickListener.onItemClick(this.getLayoutPosition());
$ b我的适配器类
public class MyAdapter extends RecyclerView.Adapter< MyViewHolder> {
上下文c;
ArrayList< Spacecraft>航天器;
public MyAdapter(Context c,ArrayList< Spacecraft> spacecrafts){
this.c = c;
this.spacecrafts = spacecrafts;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent,int viewType){
View v = LayoutInflater.from(c).inflate(R.layout.model,parent,假);
返回新的MyViewHolder(v);
}
@Override
public void onBindViewHolder(MyViewHolder holder,int position){
final Spacecraft s = spacecrafts.get(position);
holder.nameTxt.setText(s.getName());
holder.propTxt.setText(s.getPropellant());
holder.descTxt.setText(s.getDescription());
holder.setItemClickListener(new ItemClickListener(){
@Override
public void onItemClick(int pos){
// OPEN DETAI ACTIVITY
openDetailActivity(s.getName ),s.getDescription(),s.getPropellant());
}
});
@Override
public int getItemCount(){
return spacecrafts.size();
//打开详细信息活动
private void openDetailActivity(String ... details)
{
Intent i = new Intent(c,DetailActivity.class);
i.putExtra(NAME_KEY,details [0]);
i.putExtra(DESC_KEY,details [1]);
i.putExtra(PROP_KEY,details [2]);
c.startActivity(i);
$ b 我在onCreate中的主要功能我打电话给这样的数据
recycler =(RecyclerView)rootView.findViewById(R.id.recycler);
recycler.setLayoutManager(new LinearLayoutManager(getActivity()));
database = FirebaseDatabase.getInstance()。getReference();
spacecraft = new ArrayList<>();
firebasehelper = new FirebaseHelper(database);
adapter = new JAdapter(getActivity(),firebasehelper.retrieve());
recycler.setAdapter(adapter);
解决方案修改helper构造器是这样的: >
public FirebaseHelper(Context c,DatabaseReference db,ListView lv){
this.c = c;
this.db = db;
this.lv = lv;
$ b 然后在for循环之后将其添加到fetchData方法中:
如果(spacecrafts.size()> 0)
{
adapter = new CustomAdapter(c,spacecrafts);
lv.setAdapter(adapter);
adapter.notifyDataSetChanged();
$ / code>
然后在主要活动中像这样修改它:
helper = new FirebaseHelper(this,db,lv);
// ADAPTER
// adapter = new CustomAdapter(this,helper.retrieve());
//lv.setAdapter(adapter);
helper.retrieve();
这应该适合您。
I have tried everything but my data from firebase is not getting loaded automatically when I open the app and I have to click a edittext to load the data.
I have tried
adapter.Update(data);
recycler.invalidate();
notifyDataSetChanged();
adapter.notifyDataSetChanged();
Please can someone help me out.
EDITED:
I am saving to firebase like this:
public FirebaseHelper(DatabaseReference db) {
this.db = db;
}
//WRITE IF NOT NULL
public Boolean save(Spacecraft spacecraft)
{
if(spacecraft==null)
{
saved=false;
}else
{
try
{
db.child("Spacecraft").push().setValue(spacecraft);
saved=true;
}catch (DatabaseException e)
{
e.printStackTrace();
saved=false;
}
}
return saved;
}
//IMPLEMENT FETCH DATA AND FILL ARRAYLIST
private void fetchData(DataSnapshot dataSnapshot)
{
spacecrafts.clear();
for (DataSnapshot ds : dataSnapshot.getChildren())
{
Spacecraft spacecraft=ds.getValue(Spacecraft.class);
spacecrafts.add(spacecraft);
}
}
//READ THEN RETURN ARRAYLIST
public ArrayList<Spacecraft> retrieve() {
db.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
fetchData(dataSnapshot);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s){
fetchData(dataSnapshot);
}
});
return spacecrafts;
}
}
My viewholder class
public MyViewHolder(View itemView) {
super(itemView);
nameTxt= (TextView) itemView.findViewById(R.id.nameTxt);
propTxt= (TextView) itemView.findViewById(R.id.propellantTxt);
descTxt= (TextView) itemView.findViewById(R.id.descTxt);
itemView.setOnClickListener(this);
}
public void setItemClickListener(ItemClickListener itemClickListener)
{
this.itemClickListener=itemClickListener;
}
@Override
public void onClick(View view) {
this.itemClickListener.onItemClick(this.getLayoutPosition());
}
My adapter class
public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
Context c;
ArrayList<Spacecraft> spacecrafts;
public MyAdapter(Context c, ArrayList<Spacecraft> spacecrafts) {
this.c = c;
this.spacecrafts = spacecrafts;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v=LayoutInflater.from(c).inflate(R.layout.model,parent,false);
return new MyViewHolder(v);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
final Spacecraft s=spacecrafts.get(position);
holder.nameTxt.setText(s.getName());
holder.propTxt.setText(s.getPropellant());
holder.descTxt.setText(s.getDescription());
holder.setItemClickListener(new ItemClickListener() {
@Override
public void onItemClick(int pos) {
//OPEN DETAI ACTIVITY
openDetailActivity(s.getName(),s.getDescription(),s.getPropellant());
}
});
}
@Override
public int getItemCount() {
return spacecrafts.size();
}
//OPEN DETAIL ACTIVITY
private void openDetailActivity(String...details)
{
Intent i=new Intent(c,DetailActivity.class);
i.putExtra("NAME_KEY",details[0]);
i.putExtra("DESC_KEY",details[1]);
i.putExtra("PROP_KEY",details[2]);
c.startActivity(i);
}
in my mainactivity in onCreate I am calling the data like this
recycler = (RecyclerView) rootView.findViewById(R.id.recycler);
recycler.setLayoutManager(new LinearLayoutManager(getActivity()));
database = FirebaseDatabase.getInstance().getReference();
spacecraft = new ArrayList<>();
firebasehelper = new FirebaseHelper(database);
adapter = new JAdapter(getActivity(), firebasehelper.retrieve());
recycler.setAdapter(adapter);
解决方案 modify the helper constructer to be like this:
public FirebaseHelper(Context c, DatabaseReference db, ListView lv) {
this.c = c;
this.db = db;
this.lv = lv;
}
then add this to the fetchData method after the for loop:
if (spacecrafts.size() > 0)
{
adapter = new CustomAdapter(c, spacecrafts);
lv.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
then in the main activity modify it like this:
helper = new FirebaseHelper(this, db, lv);
//ADAPTER
//adapter = new CustomAdapter(this, helper.retrieve());
//lv.setAdapter(adapter);
helper.retrieve();
this should work for you.
这篇关于Recylerview不会自动从Firebase Android Studio加载数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!