主活动在返回mainactivity后再次从firebase数据库中读取数据

时间:2017-11-24 16:36:11

标签: java android android-recyclerview

这是我的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(查看视图){

        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中的项目,我可以转到详细信息活动。假设数据库中有3个项目,并且在第一个主要活动中仅显示3个项目。但是在进入详细信息活动,然后回到主要活动后,有6个项目,前面的3个项目重复。如果再次进入详细信息活动并返回,则会有9个项目。我用过(Activity)context).finish();在RecyclerViewAdapter中完成主要活动,但我认为它完成了我能够获取详细信息的上下文。 请帮忙。 对不起,我的英语不好。

1 个答案:

答案 0 :(得分:0)

你的firebase加载数据项需要进入onCreate(),因为只有在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);