繁体   English   中英

回到主活动后,主活动再次从Firebase数据库读取数据

[英]main activity reads the data again from the firebase database after coming back to the mainactivity

这是我的MainActivity

private DatabaseReference mDatabaseReference;
private RecyclerView recyclerView;
private PlaceRecyclerAdapter placeRecyclerAdapter;
private List<Places> placesList;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mDatabaseReference = FirebaseDatabase.getInstance().getReference().child("Places");

    placesList = new ArrayList<>();

    recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu,menu);
    return super.onCreateOptionsMenu(menu);

}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId()==R.id.action_add)
    {
        startActivity(new Intent(MainActivity.this,AddPostActivity.class));
        finish();
    }
    return super.onOptionsItemSelected(item);

}

@Override
protected void onStart() {
    super.onStart();
    mDatabaseReference.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            Places places = dataSnapshot.getValue(Places.class);
            placesList.add(places);
            placeRecyclerAdapter = new PlaceRecyclerAdapter(MainActivity.this,placesList);
            recyclerView.setAdapter(placeRecyclerAdapter);
            placeRecyclerAdapter.notifyDataSetChanged();
        }

我正在使用此RecyclerAdapter在主要活动中加载cardview卡

 public PlaceRecyclerAdapter(Context context, List<Places> placesList) {
    this.context = context;
    this.placesList = placesList;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.post_row,parent,false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    Places places = placesList.get(position);
    //String imageUrl= null;

    holder.place.setText(places.getPlace());
    holder.desc.setText(places.getDesc());
    //imageUrl= places.getImage();

    //todo: Use piccasso library to load images
    //Picasso.with(context).load(imageUrl).into(holder.image);


}

@Override
public int getItemCount() {
    return placesList.size();
}


public class ViewHolder extends RecyclerView.ViewHolder {
    public TextView place;
    public TextView desc;
    //public ImageView image;

    public ViewHolder(View view) {
        super(view);

        place = (TextView) view.findViewById(R.id.postTitleList);
        desc = (TextView) view.findViewById(R.id.postDescList);
        //image = (ImageView) view.findViewById(R.id.postImageList);
        view.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Context context = v.getContext();
                int pos = getAdapterPosition();
                if (pos != RecyclerView.NO_POSITION) {
                    Places clickedDataItem = placesList.get(pos);
                    //Toast.makeText(v.getContext(), "You clicked " + clickedDataItem.getPlace(), Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(context, Details.class);
                    intent.putExtra("NAME", clickedDataItem.getPlace());
                    intent.putExtra("DESC", clickedDataItem.getDesc());
                    intent.putExtra("IMG", clickedDataItem.getImage());
                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    context.startActivity(intent);

                }
            }

这是我的详细信息活动

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_details);
    dPlace = (TextView) findViewById(R.id.detail_title);
    dDesc = (TextView) findViewById(R.id.detail_desc);
    dImage = (ImageView) findViewById(R.id.detail_image);
    Bundle bundle = getIntent().getExtras();
    if (bundle != null) {
        String name = bundle.getString("NAME");
        String desc = bundle.getString("DESC");
        String img = bundle.getString("IMG");
        dPlace.setText(name);
        dDesc.setText(desc);
        Picasso.with(this).load(img).into(dImage);

现在,单击MainActivity中的一个项目,我可以转到Details活动。 假设数据库中有3个项目,并且最初的主要活动仅显示3个项目。 但是进入“详细信息”活动,然后回到主活动之后,有6个项目,前面的3个项目被重复。 如果我再次进入Details活动并返回,将有9个项目。 我使用(活动)上下文).finish(); 在RecyclerViewAdapter中完成主要活动,但我认为它完成了我可以从中获取详细信息的上下文。 请帮忙。 对不起,我的英语不好。

您的Firebase加载数据项需要放入onCreate() ,因为只有在其onstack onStart()将被调用两次时,它才会被调用一次。 因此,只需在onCreate而非onStart()实现数据项加载逻辑

  @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
        mDatabaseReference.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                Places places = dataSnapshot.getValue(Places.class);
                placesList.add(places);
                placeRecyclerAdapter = new PlaceRecyclerAdapter(MainActivity.this,placesList);
                recyclerView.setAdapter(placeRecyclerAdapter);
                placeRecyclerAdapter.notifyDataSetChanged();
            }
    }

更新资料

placesList.clear();
placesList.add(places);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM