在recyclerview firebase中施放arraylist

问题描述 投票:1回答:2

我有一系列数据,我从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) {

            }
        });
            }
android firebase firebase-realtime-database
2个回答
1
投票

代码似乎有些问题。因为它被发布,如果它编译我会感到惊讶。

在你的Adapter你有:

List<Order> myfoods;

public AllOrdersAdapter(List<Order> myfoods) {
    this.myfoods = myfoods;
}

但是在您的活动代码中,您传递了:

adapter = new AllOrdersAdapter((ArrayList<String>) myfoods);

一个是ArrayListString,另一个是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();
    }
}

注意:因为我不知道,是否应该使用ArrayListStringOrderActivityAdapter中的参数将需要更改。另外,如何将数据分配给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);

另请注意,我在上面的原始代码中进行了一些更改。


0
投票

您将要创建适配器,并将其附加到视图中,直接在onCreate中:

@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);

    adapter = new AllOrdersAdapter((ArrayList<String>) myfoods);
    lstFoods.setAdapter(adapter);

    loadOrders();
}

这也意味着你应该将myfoods声明为ArrayList<String>,这样你就不必将它转发。就像是:

ArrayList<String> myfoods = new ArrayList<String>();

现在在loadOrders中,您可以简单地将项添加到列表中,然后通知适配器其数据已更改(以便重新绘制视图):

private void loadOrders() {
    requests.child("foods").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                for (DataSnapshot ing: postSnapshot.getChildren()) {
                    myfoods.add(ing.child("quantity").getValue(String.class));
                    myfoods.add(ing.child("productName").getValue(String.class));
                    myfoods.add(ing.child("productId").getValue(String.class));
                }
            }
           adapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            throw databaseError.toException(); // don't ignore errors
        }
    });
  }
© www.soinside.com 2019 - 2024. All rights reserved.