【问题标题】:How to calculate total in recyclerview Android Firebase?如何在 recyclerview Android Firebase 中计算总数?
【发布时间】:2018-06-30 19:30:11
【问题描述】:

我想实现一个包含地点名称和票价的计划器之类的东西。我在片段和文本视图中使用 recyclerview。我在 recyclerview 中有一些项目。现在我想为我的计划者取得一个平衡,它应该是所有门票价格的预算总额 = 我的文本视图中的余额,它是片段的。这是我想要实现的图像。

Click here for image

public class planner extends AppCompatActivity {

    private RecyclerView mBlogList;
    private DatabaseReference mDatabase;
    private DatabaseReference mDatabaseCurrentUser;
    private DatabaseReference mDatabaseUsers;
    private DatabaseReference mDatabaseTicket;
    private DatabaseReference mDatabaseLoc;
    private DatabaseReference mDatabaseBudget;
    private Query mQueryCurrentUser;
    String currentUserId;
    private FirebaseAuth mAuth;
    private FirebaseAuth.AuthStateListener mAuthListener;
    private DrawerLayout mDraweLayout;
    private ActionBarDrawerToggle mToggle;
    private TextView mBudget;
    private TextView mBalance;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_planner);

        mDraweLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
        mToggle = new ActionBarDrawerToggle(this, mDraweLayout, R.string.open, R.string.close);

        mAuth = FirebaseAuth.getInstance();

        mDraweLayout.addDrawerListener(mToggle);
        mToggle.syncState();

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        NavigationView mNavigationView = (NavigationView) findViewById(R.id.nav_menu);
        mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {
                switch (menuItem.getItemId()) {

                    case(R.id.nav_home):
                        Intent home = new Intent(getApplicationContext(), home.class);
                        startActivity(home);
                        break;

                    case(R.id.nav_account):
                        Intent acc = new Intent(getApplicationContext(), updateTourist.class);
                        startActivity(acc);
                        break;

                    case(R.id.nav_go):
                        Intent goActivity = new Intent(getApplicationContext(), placepicker.class);
                        startActivity(goActivity);
                        break;

                    case(R.id.nav_planner):
                        Intent planActivity = new Intent(getApplicationContext(), planner.class);
                        startActivity(planActivity);
                        break;

                    case(R.id.nav_budget):
                        Intent budget = new Intent(getApplicationContext(), createBudget.class);
                        startActivity(budget);
                        break;

                    case(R.id.nav_logout):
                        logout();
                        break;
                }
                return true;
            }
        });

        mAuth = FirebaseAuth.getInstance();

        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {

                if (firebaseAuth.getCurrentUser() == null) {

                    Intent loginIntent = new Intent(planner.this, login.class);
                    loginIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(loginIntent);

                }

            }
        };

        mDatabase = FirebaseDatabase.getInstance().getReference().child("Location");
        mDatabaseUsers = FirebaseDatabase.getInstance().getReference().child("Tourist");

        currentUserId = mAuth.getCurrentUser().getUid();
        mDatabaseCurrentUser = FirebaseDatabase.getInstance().getReference().child("Location");

        mQueryCurrentUser = mDatabaseCurrentUser.orderByChild("uid").equalTo(currentUserId);


        mBlogList = (RecyclerView) findViewById(R.id.blog_list);


        mDatabaseUsers.keepSynced(true);

        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setReverseLayout(true);
        layoutManager.setStackFromEnd(true);

        mBlogList.setHasFixedSize(true);
        mBlogList.setLayoutManager(layoutManager);


        budget();

        checkUserExist();
    }

    @Override
    protected void onStart() {
        super.onStart();

        mAuth.addAuthStateListener(mAuthListener);

        FirebaseRecyclerAdapter<location, BlogViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<location, BlogViewHolder>(

                location.class,
                R.layout.location_list,
                BlogViewHolder.class,
                mQueryCurrentUser

        ) {
            @Override
            protected void populateViewHolder(BlogViewHolder viewHolder, location model, final int position) {

                final String post_key = getRef(position).getKey();

                viewHolder.setName(model.getName());
                viewHolder.setAddress(model.getAddress());
                viewHolder.setTicket(model.getTicket());
                if


                viewHolder.mView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                        Intent singlePlanner = new Intent(planner.this, deleteLocation.class);
                        singlePlanner.putExtra("plan_id", post_key);
                        startActivity(singlePlanner);


                    }
                });
            }


        };

        mBlogList.setAdapter(firebaseRecyclerAdapter);
    }

    //recyclerview
    public static class BlogViewHolder extends RecyclerView.ViewHolder {

        View mView;

        FirebaseAuth mAuth;

        public BlogViewHolder(View itemView) {
            super(itemView);

            mView = itemView;

            mAuth = FirebaseAuth.getInstance();


        }


        public void setName(String Name) {

            TextView post_locName = (TextView) mView.findViewById(R.id.post_title);
            post_locName.setText(Name);

        }

        public void setAddress(String Address) {

            TextView post_locAdd = (TextView) mView.findViewById(R.id.post_desc);
            post_locAdd.setText(Address);

        }

        public void setTicket(final Integer ticket){
            TextView post_ticket = (TextView) mView.findViewById(R.id.post_ticket);

            post_ticket.setText(Integer.toString(ticket));


        }


    }


    //check user exist
    private void checkUserExist() {

        if (mAuth.getCurrentUser() != null) {

            final String user_id = mAuth.getCurrentUser().getUid();

            mDatabaseUsers.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    if (mAuth.getCurrentUser().getUid().equals(user_id)) {


                    }

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }
    }

    //retrieve budget
    private void budget()
    {
        mDatabaseBudget = FirebaseDatabase.getInstance().getReference().child("Plan").child("createPlan").child("plan_budget");;
        mDatabaseBudget.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                TextView mBudget = (TextView) findViewById(R.id.post_budget);

                Integer value = dataSnapshot.getValue(Integer.class);

                mBudget.setText(Integer.toString(value));
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {


        if(item.getItemId() == R.id.action_add){

            startActivity(new Intent(planner.this, placepicker.class));

        }


        if(mToggle.onOptionsItemSelected(item)){

            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.main_menu, menu);
        return super.onCreateOptionsMenu(menu);

    }

    private void logout() {

        mAuth.signOut();

    }
}

【问题讨论】:

    标签: android listview firebase firebase-realtime-database android-recyclerview


    【解决方案1】:

    我认为您有不同的选择。 一种是从适配器覆盖onDataChanged() 方法。它应该对 Snapshot 中的所有项目求和,并使用最终总和编辑 TextView。 这是它的文档:https://github.com/firebase/FirebaseUI-Android/tree/master/database#data-and-error-events

    第二个是观察带有物品ObservableSnapshotArray的快照,在更新时迭代物品并计算价格的总和。但我认为对于你的情况,第一个会更好。

    【讨论】:

    • 我已经尝试在 onDataChanged() 中做。但它只计算 1 个数据。
    • 不确定你是如何实现的,但是你可以使用getSnapshots()访问快照,使用size()的大小和get()的每个元素,这样你就可以遍历列表并求和提高所有商品的价格。每次更新快照时都应调用onDataChange()
    猜你喜欢
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多