FirebaseRecyclerAdapter 多个 viewHolder
FirebaseRecyclerAdapter multiple viewHolder
我正在尝试使用 FirebaseRecyclerAdapter
和 RecyclerView
来显示不同类型的项目。特别是用户对特定股票的股票交易。根据我的理解,我已经扩展了 FirebaseRecyclerAdapter
但它不起作用。以下是代码:
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
等是TransactionViewHolder
的子类,BuyStockTransaction
、SellStockTransaction
等是[=20的子类=].
除了构造函数之外,甚至没有调用任何函数。由于我是 android 编程的新手,所以我可能在做一些愚蠢的事情。有人可以帮助我理解我做错了什么吗?
编辑
这是我初始化适配器的方式:
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 ();
}
};
我希望我没有错过任何东西,这消除了所有疑虑。但如果没有,我会很乐意添加更多信息。
好的。我实现了自己的自定义实现 RecyclerAdapter
而不是 FirebaseRecyclerAdapter
。才意识到它仍然不起作用。但真正的问题是 RecyclerView
不可见,因为上面的 textView 将其 layout_height
设置为 match_parent
。所以这一直是我的愚蠢错误。
我正在尝试使用 FirebaseRecyclerAdapter
和 RecyclerView
来显示不同类型的项目。特别是用户对特定股票的股票交易。根据我的理解,我已经扩展了 FirebaseRecyclerAdapter
但它不起作用。以下是代码:
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
等是TransactionViewHolder
的子类,BuyStockTransaction
、SellStockTransaction
等是[=20的子类=].
除了构造函数之外,甚至没有调用任何函数。由于我是 android 编程的新手,所以我可能在做一些愚蠢的事情。有人可以帮助我理解我做错了什么吗?
编辑
这是我初始化适配器的方式:
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 ();
}
};
我希望我没有错过任何东西,这消除了所有疑虑。但如果没有,我会很乐意添加更多信息。
好的。我实现了自己的自定义实现 RecyclerAdapter
而不是 FirebaseRecyclerAdapter
。才意识到它仍然不起作用。但真正的问题是 RecyclerView
不可见,因为上面的 textView 将其 layout_height
设置为 match_parent
。所以这一直是我的愚蠢错误。