android - 在recyclerview firebase中投射arraylist
问题描述
我有一组从 firebase 检索的数据。我正在使用 recyclerview 来显示数据,但我的适配器无法正常工作。我尝试在适配器中添加 arraylist,但这不起作用。这是说适配器没有连接,我有一个空白活动。
对此有什么帮助吗?这是我的详细信息。
模态类
public class Order {
private String ProductId;
private String ProductName;
private String Quantity;
public Order() {
}
public String getProductId() {
return ProductId;
}
public void setProductId(String productId) {
ProductId = productId;
}
public String getProductName() {
return ProductName;
}
public void setProductName(String productName) {
ProductName = productName;
}
public String getQuantity() {
return Quantity;
}
public void setQuantity(String quantity) {
Quantity = quantity;
}
public Order(String productId, String productName, String quantity) {
ProductId = productId;
ProductName = productName;
Quantity = quantity;
}
}
适配器
public class AllOrdersAdapter extends RecyclerView.Adapter<AllOrdersViewHolder> {
List<Order> myfoods;
public AllOrdersAdapter(List<Order> myfoods) {
this.myfoods = myfoods;
}
@NonNull
@Override
public AllOrdersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.allorders_layout,parent,false);
return new AllOrdersViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull AllOrdersViewHolder holder, int position) {
holder.foodname.setText(myfoods.get(position).getProductName());
holder.foodquantity.setText(myfoods.get(position).getQuantity());
holder.foodId.setText(myfoods.get(position).getProductId());
}
@Override
public int getItemCount() {
return myfoods.size();
}
}
测试班
public class Test extends AppCompatActivity {
FirebaseDatabase db;
DatabaseReference requests;
RecyclerView lstFoods;
RecyclerView.LayoutManager layoutManager;
TextView food_id,food_quan,food_name;
// List foods = new ArrayList<>();
// RecyclerView.Adapter<AllOrder> adapter;
// List<String> myOrders = new ArrayList<String>();
// ArrayList<String> foods=new ArrayList<>();
List<String> myfoods = new ArrayList<String>();
AllOrdersAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
//firebase
db = FirebaseDatabase.getInstance();
requests= db.getReference().child("Requests");
lstFoods = (RecyclerView)findViewById(R.id.lstAllFoods);
lstFoods.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(this);
lstFoods.setLayoutManager(layoutManager);
loadOrderss();
}
private void loadOrderss() {
requests.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
if (postSnapshot.getValue() != null) {
// List ingredients = new ArrayList<>();
for (DataSnapshot ing : postSnapshot.child("foods").getChildren()) {
// String data = String.valueOf(postSnapshot.getValue(Order.class));
myfoods.add(ing.child("quantity").getValue(String.class));
myfoods.add(ing.child("productName").getValue(String.class));
myfoods.add(ing.child("productId").getValue(String.class));
// myfoods.add(String.valueOf(Order.class));
System.out.println("Gained data: " + ing.child("productName").getValue(String.class));
}
}
}
adapter = new AllOrdersAdapter((ArrayList<String>) myfoods);
lstFoods.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
解决方案
代码似乎有一些问题。正如它发布的那样,如果它编译,我会感到惊讶。
在你的Adapter
你有:
List<Order> myfoods;
和
public AllOrdersAdapter(List<Order> myfoods) {
this.myfoods = myfoods;
}
但在您的活动代码中,您通过:
adapter = new AllOrdersAdapter((ArrayList<String>) myfoods);
一个ArrayList
是String
另一个Order
!
您还需要将您的适配器类更改为:
public class AllOrdersAdapter extends RecyclerView.Adapter<AllOrdersAdapter.AllOrdersViewHolder> {
private static final String TAG = AllOrdersAdapter.class.getSimpleName();
private ArrayList<Order> mData;
public class AllOrdersViewHolder extends RecyclerView.ViewHolder {
public TextView mTvFoodname;
public TextView mTvFoodQuantity;
public TextView mTvFoodId;
public AllOrdersViewHolder(View v){
super(v);
// TODO: You need to assign the appropriate View Id's instead of the placeholders ????
mTvFoodQuantity = v.findViewById(R.id.????);
mTvFoodname = v.findViewById(R.id.????);
mTvFoodId = v.findViewById(R.id.????);
}
}
public AllOrdersAdapter(ArrayList<Order> data){
this.mData = data;
}
@Override
public AllOrdersViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.business_list_card_view, parent, false);
return new AllOrdersViewHolder(itemView);
}
@Override
public void onBindViewHolder(final AllOrdersViewHolder holder, final int position){
//TODO: You need to decide whether you want to pass a string or order object
Order data = mData.get(position);
final String name = data.getProductName();
final String quantity = data.getQuantity();
final String id = data.getProductId();
holder.mTvFoodname.setText(name);
holder.mTvFoodQuantity.setText(quantity );
holder.mTvFoodId.setText(id)
}
@Override
public int getItemCount(){
return mData.size();
}
}
注意:因为我不知道是否应该使用an或 of ArrayList
,所以or中的参数需要更改。此外,您如何将数据分配给该方法也会受到影响。String
Order
Activity
Adapter
RecyclerView
onBindViewHolder
你也应该听从弗兰克的建议。
编辑
onDataChange()
将您的方法更改为:
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
if (postSnapshot.getValue() != null) {
List ingredients = new ArrayList<>();
for (DataSnapshot ing : postSnapshot.child("foods").getChildren()) {
String name = ing.child("productName").getValue(String.class);
String quantity = ing.child("quantity").getValue(String.class);
String productId = ing.child("productId").getValue(String.class);
// Using your overloaded class constructor to populate the Order data
Order order = new Order(productId, name, quantity);
// here we are adding the order to the ArrayList
myfoods.add(order);
Log.e(TAG, "Gained data: " + name)
}
}
}
adapter.notifyDataSetChanged();
}
在您的Activity
中,您需要将ArrayList
类变量“myfoods”更改为:
ArrayList(Order) myfoods = new ArrayList<>();
在您的onCreate()
方法中,您现在可以更改:
adapter = new AllOrdersAdapter((ArrayList<String>) myfoods);
简单地说:
adapter = new AllOrdersAdapter(myfoods);
另请注意,我对上面的原始代码进行了一些更改。
推荐阅读
- scala - 在 sbt-scalajs-crossproject 插件中,您如何为 JS 和 JVM 编译目标指定一个主类?
- javascript - 我需要帮助为我的一种方法修复单元测试
- r - R:带有交互 IV 的 felm 函数
- swift - swift repl 在 linux 的 windows 子系统中不起作用
- git - 在发布分支中查找先前的合并提交
- reactjs - 了解动画和键盘事件
- c++ - C++:在包含的头文件中使用#define 常量(Arduino)
- regex - 多行文本中匹配组的正则表达式
- javascript - 如何使用 NodeJS + ExpressJS 连接到远程 phpMyAdmin 服务器
- git - 如何保护 Azure DevOps 存储库