在Arraylists / RecyclerView中订购Firebase数据

时间:2017-12-14 03:52:02

标签: java android sorting arraylist firebase-realtime-database

我正在尝试将数据从Firebase数据库提取到RecyclerView并正确排序。我成功地将数据输入了recyclerview,但排序错误。

我得到的是: Android Screenshot

基本上它是在命令它们:

  • 企业

My Firebase DB

它在应用程序MOST当时的命令如此,虽然有一次它正确排序,这让我相信它有点随机,取决于哪个任务首先完成。

我最初查找了arraylist(How to sort ArrayList<Long> in Java in decreasing order?)的订购,然后订购了firebase(https://firebase.google.com/docs/database/android/lists-of-data#sort_data),并且不确定是否还有其他我缺少的东西?

异步onDataChange和Callback的组合如何决定哪个完成?它不是按照我在代码中的顺序执行的。

我希望他们先按最低价格订购,所以:

  1. Micro
  2. 中等
  3. 企业
  4. 这是我的代码:

      

    RegisterSubscriptionActivity.java:

    public class RegisterSubscriptionActivity extends Activity {
    
        //Firebase Database References
        DatabaseReference mDatabase;
        DatabaseReference mDatabaseMicro;
        DatabaseReference mDatabaseSmall;
        DatabaseReference mDatabaseMedium;
        DatabaseReference mDatabaseLarge;
        DatabaseReference mDatabaseEnterprise;
        DatabaseReference mListItemRef;
    
        ArrayList subscriptionInfo;
    
        //Subscription (String) values
        String name, number, price;
    
    
        //RECYCLERVIEW ITEMS
        private Context mContext;
        LinearLayout mLinearLayout;
        private RecyclerView mRecyclerView;
        private MyAdapterSubscription mAdapter = new MyAdapterSubscription(this);
        private RecyclerView.LayoutManager mLayoutManager;
        //ArrayList<LinearLayout> linearLayoutList = new ArrayList<LinearLayout>();
    
        ArrayList<Subscription> myListItems;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_register_subscription);
    
            myListItems = new ArrayList<Subscription>();
    
            //CALLBACK SO YOU CAN GET THE DATA (FROM) THE ASYNC CALL AND USE IT OUTSIDE OF THE CALL, OTHERWISE IT WILL SHOW AS NULL
            final DataSnapshotCallback callback = new DataSnapshotCallback() {
                @Override
                public void gotDataSnapshot(DataSnapshot snapshot) {
                    Subscription subscription = new Subscription(snapshot);
                    myListItems.add(subscription);
                    mAdapter.updateDataSet(myListItems);
                    Log.i("ARRAY LIST CONTENTS", myListItems.get(0).getName());
                    Log.i("DATA","Name: " + subscription.getName() + " Price: " + subscription.getPrice() + " Number: " + subscription.getNumber());
    
                }
        };
    
    
            mDatabase = FirebaseDatabase.getInstance().getReference("Subscription");
            mDatabaseMicro = mDatabase.child("Micro");
            mDatabaseSmall = mDatabase.child("Small");
            mDatabaseMedium = mDatabase.child("Medium");
            mDatabaseLarge = mDatabase.child("Large");
            mDatabaseEnterprise = mDatabase.child("Enterprise");
    
            ValueEventListener eventListener = new ValueEventListener() {
    
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
    
                    callback.gotDataSnapshot(dataSnapshot);  //CALLS THE CALLBACK AND SENDS THE DATASNAPSHOT TO IT
    
                }
    
    
                @Override
                public void onCancelled(DatabaseError databaseError) {
                    Log.d("Cancelled",databaseError.toString());
                }
            };  //END of ValueEventListener
    
    
            mDatabaseMicro.addListenerForSingleValueEvent(eventListener);
            mDatabaseSmall.addListenerForSingleValueEvent(eventListener);
            mDatabaseMedium.addListenerForSingleValueEvent(eventListener);
            mDatabaseLarge.addListenerForSingleValueEvent(eventListener);
            mDatabaseEnterprise.addListenerForSingleValueEvent(eventListener);
            //Log.i("DATA ITEMS", "NAME: " + name + " / " + "NUMBER: " + number + " / " + "PRICE: " + price); //Will get Null because not in Callback
            //Log.i("LIST OF DATA: ", myListItems.toString()); //Same
    
    
            //RECYCLERVIEW STUFF
            mRecyclerView = (RecyclerView) findViewById(R.id.s_recycler_view);
    
            mContext = getApplicationContext(); // Get the application context
    
            // Define a layout for RecyclerView
            mLayoutManager = new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false);        
            mRecyclerView.setLayoutManager(mLayoutManager);
    
            // Set the adapter for RecyclerView
            mRecyclerView.setAdapter(mAdapter);
    
    
        } //END OF ONCREATE
    
        interface DataSnapshotCallback {
            void gotDataSnapshot(DataSnapshot snapshot);
        }
    
    }
    
      

    Subscription.java:

    public class Subscription {
    
        String name, number;
        Long price;
    
        public Subscription(DataSnapshot dataSnapshot) {
    
            name = dataSnapshot.child("name").getValue(String.class);
            number = dataSnapshot.child("number").getValue(String.class);
            price = dataSnapshot.child("price").getValue(Long.class);
        }
    
        public String getName() {
            return name;
        }
    
    
        public String getNumber() {
            return number;
        }
    
    
        public Long getPrice() {
            return price;
        }
    
    
    }
    
      

    MyAdapterSubscription.java:

     class MyAdapterSubscription extends RecyclerView.Adapter<MyAdapterSubscription.ViewHolder> {
        private ArrayList<Subscription> mDataSet = new ArrayList<>();
        private Context mContext;
    
        MyAdapterSubscription(Context context){
            mContext = context;
        }
    
         static class ViewHolder extends RecyclerView.ViewHolder{
    
            TextView nameTV, numberTV, priceTV;
             ViewHolder(View v){
                super(v);
                nameTV = (TextView) v.findViewById(R.id.subNameTV);
                numberTV = (TextView) v.findViewById(R.id.subNumberTV);
                priceTV = (TextView) v.findViewById(R.id.subPriceTV);
            }
        }
    
        void updateDataSet(ArrayList<Subscription> myArrayList) {
            mDataSet = myArrayList;
            // TODO: 12/13/2017 Sort array list by price. Lowest to highest.
            //Collections.sort(mDataSet);
            // TODO: 12/14/2017 Let it be clickable and link to payment
            notifyDataSetChanged();
        }
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
            // Create a new View
            View v = LayoutInflater.from(mContext).inflate(R.layout.subscription_row_layout,parent,false);
            return new ViewHolder(v);
        }
    
        //A ViewHolder object stores each of the component views inside the tag field of the Layout, so you can immediately access them without the need to look them up repeatedly.
        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            Subscription subscription = mDataSet.get(position);
            holder.nameTV.setText(subscription.getName());
            holder.numberTV.setText(subscription.getNumber());
            holder.priceTV.setText(String.format(mContext.getResources().getString(R.string.subscriptionAdapterPrice), subscription.getPrice()));
        }
    
        @Override
        public int getItemCount(){
            return mDataSet.size();
        }
    
    }
    

2 个答案:

答案 0 :(得分:0)

当Firebase按顺序加载第一个节点中的数据时 - &gt;最后一个节点因为在您的结构中,订单是企业 - &gt; ...-&gt;很小,所以它以这种方式加载数据。因此,如果您已经有5个固定节点,则可能需要将结构重新排序为小 - &gt;微 - &gt;中 - &gt;大 - &gt;企业。 你也可以使用firebase提供的几个Sort Data Method 在您的情况下,由于您只有5个节点,如果您将它们读入ArrayList,您可能只需要执行Collections.sort(arraylist,Collections.reverseOrder())

答案 1 :(得分:-1)

很简单

由于您使用的是firebase数据存储区。

您可以通过这3种方法对值进行排序。 orderByChild()
orderByKey() orderByValue()