2017-08-21 11 views
0

Dies ist die bearbeitete Version meiner Fragment-Klasse in meiner Hauptaktivität. Es gab einige Fehler - es wurde nichts angezeigt und die Daten wurden nicht mehr in der Datenbank gespeichert.Firebase-Daten in einer benutzerdefinierten Adapteransicht in der Registerkarte "Fragment" anzeigen

public static class DummyFragment extends Fragment { 
    int color; 

    public DummyFragment() { 
    } 

    @SuppressLint("ValidFragment") 
    public DummyFragment(int color) { 
     this.color = color; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.dummy_fragment, container, false); 
     final RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.dummyfrag_scrollableview); 
     final FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.dummyfrag_bg); 
     frameLayout.setBackgroundColor(color); 
     LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity().getBaseContext()); 
     recyclerView.setLayoutManager(linearLayoutManager); 
     recyclerView.setHasFixedSize(true); 

     DatabaseReference mDatabaseGig; 
     final List<Dessert> dessertList; 
     // get the gig database 
     mDatabaseGig = FirebaseDatabase.getInstance().getReference("Gig Posts"); 
     dessertList = new ArrayList<>(); 

     mDatabaseGig.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 

       // dessertList.clear(); 

       for(DataSnapshot gigSnapshot: dataSnapshot.getChildren()){ 
        Dessert dessert = gigSnapshot.getValue(Dessert.class); 
        dessertList.add(dessert); 
       } 
       DessertAdapter adapter = new DessertAdapter(getContext()); 
       recyclerView.setAdapter(adapter); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 




     // possible to put progress dialogue 



     return view; 
    } 
} 

Ich habe schon die rettende perfekt Feuerbasis zu arbeiten und ich bin mit dem MVC-Modell - ich einen Adapter erstellt, ein Modell und an der Haupttätigkeit verdrahtet, aber mein Problem ist, wie in der dieses Modell zu verwenden, onAddValueEventChangedListener();

public class DessertAdapter extendsRecyclerView.Adapter<DessertAdapter.DessertVh> { 

private List<Dessert> desserts = new ArrayList<>(); 
private static final int VIEW_TYPE_EMPTY_LIST_PLACEHOLDER = 0; 
private static final int VIEW_TYPE_OBJECT_VIEW = 1; 

private Context context; 

// TODO: placeholder stuff here 

@Override 
public int getItemViewType(int position) { 
    if (desserts.isEmpty()) { 
     return VIEW_TYPE_EMPTY_LIST_PLACEHOLDER; 
    } else { 
     return VIEW_TYPE_OBJECT_VIEW; 
    } 
} 
public DessertAdapter(Context context) { 
    this.context = context; 
    this.desserts = desserts; 

    desserts = Dessert.prepareDesserts(
      context.getResources().getStringArray(R.array.dessert_names), 
      context.getResources().getStringArray(R.array.dessert_descriptions), 
      context.getResources().getStringArray(R.array.dessert_amounts)); 
} 

// TODO: another placeholder stuff here 
@Override 
public DessertVh onCreateViewHolder(ViewGroup parent, int viewType) { 
    LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
    View view = inflater.inflate(R.layout.item_dessert, parent, false); 
    return new DessertAdapter.DessertVh(view); 
} 

@Override 
public void onBindViewHolder(DessertVh holder, int position) { 
    Dessert dessert = desserts.get(position); 

    holder.mName.setText(dessert.getName()); 
    holder.mDescription.setText(dessert.getDescription()); 
    holder.mFirstLetter.setText(String.valueOf(dessert.getFirstLetter())); 
    holder.mPrice.setText(String.valueOf(dessert.getAmount())); 

} 

@Override 
public int getItemCount() { 
    // if nothing, return null, 
    // else return the number of items in the list 
    return desserts == null ? 0 : desserts.size(); 
} 

public static class DessertVh extends RecyclerView.ViewHolder { 

    private TextView mName; 
    private TextView mPrice; 
    private TextView mDescription; 
    private TextView mFirstLetter; 

    public DessertVh(View itemView) { 
     super(itemView); 

     mName = (TextView) itemView.findViewById(R.id.txt_name); 
     mPrice = (TextView) itemView.findViewById(R.id.txt_price); 
     mDescription = (TextView) itemView.findViewById(R.id.txt_desc); 
     mFirstLetter = (TextView) itemView.findViewById(R.id.txt_firstletter); 
    } 
} 
} 

Haupttätigkeit in dem die Registerkarten angezeigt werden

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_tabs_header); 
    // get the gig database 
    mDatabaseGig = FirebaseDatabase.getInstance().getReference("Gig Posts"); 
    dessertList = new ArrayList<>(); 

    // Configure sign-in to request the user's ID, email address, and basic 
    // profile. ID and basic profile are included in DEFAULT_SIGN_IN. 
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
      .requestEmail() 
      .build(); 

    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .enableAutoManage(this , this) 
      .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
      .build(); 

Dadurch wird die Anzeige der Daten übernimmt

@Override 
public void onStart(){ 
    super.onStart(); 
    mFirebaseAuth.addAuthStateListener(firebaseAuthListener); 

    // load the data from database here 
    mDatabaseGig.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      dessertList.clear(); 

      for(DataSnapshot gigSnapshot: dataSnapshot.getChildren()){ 
       Dessert dessert = gigSnapshot.getValue(Dessert.class); 
       dessertList.add(dessert); 
      } 
      // maybe this will work? 
      DummyFragment dummyFragment = new DummyFragment(); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

} 

einige Code hier fehlt aber immer noch ein Teil von mainactivity Dies ist der Dummy Fragment Klasse innerhalb der Haupttätigkeit

public static class DummyFragment extends Fragment { 
    int color; 

    public DummyFragment() { 
    } 

    @SuppressLint("ValidFragment") 
    public DummyFragment(int color) { 
     this.color = color; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.dummy_fragment, container, false); 

     final FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.dummyfrag_bg); 
     frameLayout.setBackgroundColor(color); 

     RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.dummyfrag_scrollableview); 

     LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity().getBaseContext()); 
     recyclerView.setLayoutManager(linearLayoutManager); 
     recyclerView.setHasFixedSize(true); 

     // possible to put progress dialogue 
     DessertAdapter adapter = new DessertAdapter(getContext()); 
     recyclerView.setAdapter(adapter); 

     return view; 
    } 
} 
+1

Setzen Sie den Firebase Code innerhalb des Fragments, nicht die Aktivität –

Antwort

0

Setzen Sie den Firebase-Code in das Fragment, nicht die Aktivität und übergeben Sie auch die DessertList als Parameter an den DessertAdapter.

Beispiel:

public static class DummyFragment extends Fragment { 
    int color; 

    public DummyFragment() { 
    } 

    @SuppressLint("ValidFragment") 
    public DummyFragment(int color) { 
     this.color = color; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.dummy_fragment, container, false); 
     final RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.dummyfrag_scrollableview); 
     final FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.dummyfrag_bg); 
     frameLayout.setBackgroundColor(color); 
     LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity().getBaseContext()); 
     recyclerView.setLayoutManager(linearLayoutManager); 
     recyclerView.setHasFixedSize(true); 

     DatabaseReference mDatabaseGig; 
     final List<Dessert> dessertList; 
     // get the gig database 
     mDatabaseGig = FirebaseDatabase.getInstance().getReference("Gig Posts"); 
     dessertList = new ArrayList<>(); 
     DessertAdapter adapter = new DessertAdapter(getContext(), dessertList); 
     recyclerView.setAdapter(adapter); 

     mDatabaseGig.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 

       // dessertList.clear(); 

       for(DataSnapshot gigSnapshot: dataSnapshot.getChildren()){ 
        Dessert dessert = gigSnapshot.getValue(Dessert.class); 
        dessertList.add(dessert); 
        adapter.notifyDataSetChanged(); 
       } 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 





     // possible to put progress dialogue 



     return view; 
    } 
} 
+0

habe mich schon und es wurde nichts angezeigt wird, ist es nicht einmal in die Datenbank spart. Mein aktualisierter Code wurde am Anfang des Posts hinzugefügt. – user3267274

+0

Sie übergeben die Dessertliste nicht an den DessertAdapter ... \t DessertAdapter adapter = neuer DessertAdapter (getContext(), dessertList); Sie müssen den Adapter auch nur einmal ... außerhalb Ihres addValueEventListener setzen. Ich habe bereits den Code meiner Antwort aktualisiert ... bitte werfen Sie einen Blick. – mmucito

+0

Danke! Es funktioniert perfekt, aber es wird in einer FIFO-Methode angezeigt, ich möchte die neuesten Elemente an der Spitze anzeigen. – user3267274

Verwandte Themen