2016-08-02 18 views
1

Ich versuche FirebaseRecyclerAdapter mit RecyclerView zu verwenden, um Elemente verschiedener Typen anzuzeigen. Spezifische Lagertransaktionen einer bestimmten Aktie durch einen Benutzer. Ich habe FirebaseRecyclerAdapter nach meinem Verständnis erweitert, aber es funktioniert nicht. Es folgt der Code:FirebaseRecyclerAdapter multiple viewHolder

public abstract class StockTransactionFirebaseRecyclerAdapter extends 
     FirebaseRecyclerAdapter<StockTransactionType, TransactionViewHolder> 
     implements ListenerInterface 
{ 
    private static final String TAG = "StockTxnAdapter"; 
    private DatabaseReference mFirebaseDatabaseReference; 
    private FirebaseListenerManager mFirebaseListenerManager; 
    private String mUserId; 

    public StockTransactionFirebaseRecyclerAdapter (Query ref, DatabaseReference databaseReference, 
                String userId) 
    { 
     // The layout portfolio_buy_transaction_item is just a dummy since we are 
     // inflating our own layouts when required. 
     super (StockTransactionType.class, R.layout.portfolio_buy_transaction_item, 
       TransactionViewHolder.class, ref); 

     mFirebaseDatabaseReference = databaseReference; 
     mFirebaseListenerManager = new FirebaseListenerManager(); 
     mUserId = userId; 
     Log.e (TAG, "Inside StockTransactionFirebaseRecyclerAdapter"); 
    } 

    @Override 
    public int getItemViewType (int position) 
    { 
     StockTransactionType stockTransactionType = getItem (position); 
     Log.e (TAG, "Inside getItemViewType (" + position + "): " + stockTransactionType.returnType()); 
     return stockTransactionType.returnType(); 
    } 

    @Override 
    public TransactionViewHolder onCreateViewHolder (ViewGroup parent, int viewType) 
    { 
     Log.e (TAG, "onCreateViewHolder for " + viewType); 
     View itemView; 
     switch (viewType) 
     { 
      case StockTransactionType.TRANSACTION_TYPE_BUY: 
       itemView = LayoutInflater.from (parent.getContext()) 
         .inflate (R.layout.portfolio_buy_transaction_item, parent, false); 
       return new BuyTransactionViewHolder (itemView); 
      case StockTransactionType.TRANSACTION_TYPE_SELL: 
       itemView = LayoutInflater.from (parent.getContext()) 
         .inflate (R.layout.portfolio_sell_transaction_item, parent, false); 
       return new SellTransactionViewHolder (itemView); 
      case StockTransactionType.TRANSACTION_TYPE_DIVIDEND: 
       itemView = LayoutInflater.from (parent.getContext()) 
         .inflate (R.layout.portfolio_dividend_transaction_item, parent, false); 
       return new DividendTransactionViewHolder (itemView); 
      case StockTransactionType.TRANSACTION_TYPE_SPLIT: 
       itemView = LayoutInflater.from (parent.getContext()) 
         .inflate (R.layout.portfolio_split_transaction_item, parent, false); 
       return new SplitTransactionViewHolder (itemView); 
     } 

     throw new IllegalStateException ("Invalid transaction type: " + viewType); 
    } 

    @Override 
    protected void populateViewHolder (final TransactionViewHolder viewHolder, 
             StockTransactionType stockTransactionType, int position) 
    { 
     final String transactionId = this.getRef (position).getKey(); 
     final Class transaction; 
     final String location; 

     Log.e (TAG, "populateViewHolder: " + stockTransactionType.getClass().getName() + " " 
       + position); 

     switch (stockTransactionType.returnType()) 
     { 
      case StockTransactionType.TRANSACTION_TYPE_BUY: 
       transaction = BuyStockTransaction.class; 
       location = FirebaseDatabaseUtil.CHILD_TRANSACTIONS_BUY; 
       break; 
      case StockTransactionType.TRANSACTION_TYPE_SELL: 
       transaction = SellStockTransaction.class; 
       location = FirebaseDatabaseUtil.CHILD_TRANSACTIONS_SELL; 
       break; 
      case StockTransactionType.TRANSACTION_TYPE_SPLIT: 
       transaction = SplitStockTransaction.class; 
       location = FirebaseDatabaseUtil.CHILD_TRANSACTIONS_SPLIT; 
       break; 
      case StockTransactionType.TRANSACTION_TYPE_DIVIDEND: 
       transaction = DividendStockTransaction.class; 
       location = FirebaseDatabaseUtil.CHILD_TRANSACTIONS_DIVIDEND; 
       break; 
      default: 
       throw new IllegalStateException ("Invalid transaction type: " 
         + stockTransactionType.renameTypeString()); 
     } 

     DatabaseReference databaseReference = mFirebaseDatabaseReference 
       .child (location).child (mUserId).child (transactionId); 
     ValueEventListener valueEventListener = databaseReference 
       .addValueEventListener (new ValueEventListener() 
       { 
        @Override 
        public void onDataChange (DataSnapshot dataSnapshot) 
        { 
         StockTransaction stockTransaction = (StockTransaction) dataSnapshot.getValue (transaction); 
         viewHolder.assignViewHolder (stockTransaction); 
        } 

        @Override 
        public void onCancelled (DatabaseError databaseError) 
        { 
         if (getActivity() instanceof MainActivity) 
         { 
          MainActivity mainActivity = (MainActivity) getActivity(); 
          mainActivity.showDatabaseError (TAG, Thread.currentThread() 
            .getStackTrace(), databaseError); 
         } 
        } 
       }); 

     mFirebaseListenerManager.addListner (databaseReference, valueEventListener); 
    } 

    protected abstract Activity getActivity(); 

    @Override 
    public void removeAllListeners() 
    { 
     mFirebaseListenerManager.removeAllListners(); 
    } 
} 

BuyTransactionViewHolder, SellTransactionViewHolder usw. sind Subklassen von TransactionViewHolder, und, BuyStockTransaction, SellStockTransaction usw. sind Subklassen von StockTransaction.

Neben dem Konstruktor wird auch keine Funktion aufgerufen. Da ich neu in Android-Programmierung bin, mache ich etwas Dummes. Kann mir jemand helfen zu verstehen, was ich falsch mache?

bearbeiten

Dies ist, wie ich Adapter am Initialisierung:

final DatabaseReference databaseReference = mFirebaseDatabaseReference 
      .child (FirebaseDatabaseUtil.CHILD_USER_STOCK_TRANSACTIONS) 
      .child (mUserId).child (mStockId); 
mStockTransactionFirebaseRecyclerAdapter = new StockTransactionFirebaseRecyclerAdapter (
     databaseReference, mFirebaseDatabaseReference, mUserId) 
{ 
    @Override 
    protected Activity getActivity() 
    { 
     return StockDisplayFragment.this.getActivity(); 
    } 
}; 

ich hoffe ich habe auf etwas nicht zu kurz, und dies löscht alle Zweifel. Aber wenn nicht, würde ich mich freuen, weitere Informationen hinzuzufügen.

+0

Bitte hängen Sie sich an json db structure und rules, damit wir sehen können, wie diese Transaktionen gespeichert werden – jirungaray

+0

@jirungaray Ich habe die von Ihnen angeforderten Details hinzugefügt. Vielen Dank. – Prabhat

Antwort

0

Ok. Ich implementierte meine eigene Implementierung von RecyclerAdapter anstelle von FirebaseRecyclerAdapter. Nur um zu erkennen, dass es noch nicht funktioniert hat. Aber das eigentliche Problem war, dass RecyclerView nicht sichtbar war wegen einer textView über die layout_height auf gesetzt wurde. Es war also mein dummer Fehler.

Verwandte Themen