Firebase没有写入预期的孩子,在Android的下一个孩子上更新它

时间:2017-08-01 18:02:10

标签: android json firebase android-recyclerview

尝试在互联网上找到的答案,实际上代码没有变化,因为它看似正确但无法找到错误的位置。

我的输入参数:

enter image description here

JSON返回: (我期待一个" clocation"孩子和价值,但它甚至不会把它写到树上。另外,clocation的值写入cbudget)

enter image description here

项目类:

public class Project {

String ctitle, cdetail, clocation, cbudget;



public Project() {

}

public String getCtitle() {
    return ctitle;
}

public void setCtitle(String ctitle) {
    this.ctitle = ctitle;
}

public String getCdetail() {
    return cdetail;
}

public void setCdetail(String cdetail) {
    this.cdetail = cdetail;
}

public String getClocation() {
    return clocation;
}

public void setClocation(String clocation) {
    this.clocation = clocation;
}

public String getCbudget() {
    return cbudget;
}

public void setCbudget(String cbudget) {
    this.cbudget = cbudget;
}

MyViewHolder

public MyViewHolder(View itemView) {

    super(itemView);

    titleTxt = (TextView) itemView.findViewById(R.id.titleTxt);
    detailTxt = (TextView) itemView.findViewById(R.id.detailTxt);
    locationTxt = (TextView) itemView.findViewById(R.id.locationTxt);
    budgetTxt = (TextView) itemView.findViewById(R.id.budgetTxt);


    itemView.setOnClickListener(this);

}

MyAdapter

public MyAdapter(Context c, ArrayList<Project> projects) {
    this.c = c;
    this.projects = projects;
}


@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  Project s = projects.get(position);

    holder.titleTxt.setText(s.getCtitle());
    holder.detailTxt.setText(s.getCdetail());
    holder.locationTxt.setText(s.getClocation());
    holder.budgetTxt.setText(s.getCbudget());



    holder.setItemClickListener(new ItemClickListener() {

        @Override
        public void onItemClick(int pos) {


            //OPEN DETAIL ACTIVITY
            openDetailActivity(s.getCtitle(),s.getCdetail(),s.getClocation(),s.getCbudget());
        }
    });
}
@Override
public int getItemCount() {

    return projects.size();
}

//OPEN DETAIL ACTIVITY
private void openDetailActivity(String...details)
{
    Intent i=new Intent(c,DetailActivity.class);
    i.putExtra("TITLE_KEY",details[0]);
    i.putExtra("DETAIL_KEY",details[1]);
    i.putExtra("LOCATION_KEY",details[2]);
    i.putExtra("BUDGET_KEY",details[3]);

    c.startActivity(i);
}

FirebaseHelper

public class FirebaseHelper {

DatabaseReference db;
Boolean saved = null;
ArrayList<Project> projects=new ArrayList<>();

public FirebaseHelper(DatabaseReference db) {
    this.db = db;
}

//WRITE IF NOT NULL
public Boolean save(Project project)
{
    if(project==null)
    {
        saved=false;
    }
    else
    {
        try
        {
            db.child("Project").push().setValue(project);
            saved=true;

        }catch (DatabaseException e)
        {
            e.printStackTrace();
            saved=false;
        }
    }
    return saved;
}
//IMPLEMENT FETCH DATA AND FILL ARRAYLIST
private void fetchData(DataSnapshot dataSnapshot)
{
    projects.clear();
    for (DataSnapshot ds : dataSnapshot.getChildren())
    {
        Project project = ds.getValue(Project.class);
       projects.add(project);
    }
}
//READ THEN RETURN ARRAYLIST
public ArrayList<Project> 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);
        }
        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
        }
        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });

    return projects;
}

}

接收和绑定数据:

    //RECEIVE DATA
    String title = i.getExtras().getString("TITLE_KEY");
    String detail = i.getExtras().getString("DETAIL_KEY");
    String location = i.getExtras().getString("LOCATION_KEY");
    String budget = i.getExtras().getString("BUDGET_KEY");

    //BIND DATA
    titleTxt.setText(title);
    detailTxt.setText(detail);
    locationTxt.setText(location);
    budgetTxt.setText(budget);

1 个答案:

答案 0 :(得分:1)

您的代码中的问题是您要声明onChildAdded()onChildChanged()projects方法。这意味着您的fetchData() ArrayList为null,原因是这些方法的异步行为,即使您将这些对象添加到列表中也会调用它们。

要解决这个问题,你需要在for循环之前在function appendInstagram($controls){ var instagramURL = $('#js-instagram-url-edit').val(); var instagramScript = '<script async defer src="//platform.instagram.com/en_US/embeds.js"><\/script>' var instagramHtml = $('<blockquote class="instagram-media" data-instgrm-captioned data-instgrm-version="7"> <div style="padding:8px;"> <a href="'+instagramURL+'" target="_blank"></a> </div> </blockquote>' + instagramScript); updateContent(instagramHtml, $controls); } 方法中声明ArrayList。

此更改将解决您的问题。