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.
Bitte hängen Sie sich an json db structure und rules, damit wir sehen können, wie diese Transaktionen gespeichert werden – jirungaray
@jirungaray Ich habe die von Ihnen angeforderten Details hinzugefügt. Vielen Dank. – Prabhat