繁体   English   中英

在Arraylists / RecyclerView中订购Firebase数据

[英]Ordering Firebase Data in Arraylists/RecyclerView

我正在尝试将数据从Firebase数据库拉到RecyclerView中并正确排序。 我已成功将数据导入到recyclerview中,但排序错误。

我得到的是: Android屏幕截图

本质上是在订购它们:

  • 企业

  • 介质

我的Firebase数据库


有时它在应用程序中的排序时间是MOST,尽管有一次它正确排序,这使我相信它有些随机,具体取决于哪个任务首先完成。

我最初是查看arraylist的顺序( 如何在Java中按降序对ArrayList <Long>进行排序? ),然后是firebase的顺序( https://firebase.google.com/docs/database/android/lists-of-data #sort_data ),不确定是否还有其他我想念的东西吗?

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


我希望首先以最低价格订购它们,所以:

  1. 介质
  2. 企业

这是我的代码:

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();
    }

}

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

很简单

由于您正在使用Firebase数据存储。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM