我正在尝试将数据从Firebase数据库提取到RecyclerView并正确排序。我成功地将数据输入了recyclerview,但排序错误。
我得到的是: Android Screenshot
基本上它是在命令它们:
小
企业
大
微
中
它在应用程序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的组合如何决定哪个完成?它不是按照我在代码中的顺序执行的。
我希望他们先按最低价格订购,所以:
这是我的代码:
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();
}
}
答案 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()