使用Firebase数据

时间:2017-07-20 05:05:16

标签: android android-fragments firebase android-recyclerview

应用

我正在构建一个Android应用程序,其中某些项目的订单将从客户处获得。这些订单可以有4种不同的状态:PendingConfirmedCompletedCancelled。我已经为此写了必要的firebase规则。 我最初的设计是在单个活动,HomeActivity中列出所有订单,一切看起来都不错。但后来我决定将设计更改为标签和viewpager,用于同一status中订单的每个HomeActivity。我正在使用最好的库之一 smart tab layout 来生成我的观点。

当前设计

我计划保留一个Fragment并相应更新recyclerview的适配器。

HomeActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    Global.replaceFragmentWithAnimation(new HomeTabFragment(), getSupportFragmentManager(), R.id.frame_container);
}

Global.replaceFragmentWithAnimation是一个静态方法,它只是将片段替换为必要的容器。

HomeTabFragment.java

public class HomeTabFragment extends Fragment implements SmartTabLayout.TabProvider {
    public HomeTabFragment() {
        // Required empty public constructor
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_home_tab, container, false);
        final ViewPager viewPager = view.findViewById(R.id.viewpager);
        final SmartTabLayout viewPagerTab = view.findViewById(R.id.viewpagertab);
        viewPagerTab.setCustomTabView(this);
        FragmentPagerItems pages = new FragmentPagerItems(getContext());
        pages.add(FragmentPagerItem.of("Pending", OrderListsFragment.class));
        pages.add(FragmentPagerItem.of("Confirmed", OrderListsFragment.class));
        pages.add(FragmentPagerItem.of("Cancelled", OrderListsFragment.class));
        pages.add(FragmentPagerItem.of("Completed", OrderListsFragment.class));
        FragmentStatePagerItemAdapter adapter = new FragmentStatePagerItemAdapter(
                getActivity().getSupportFragmentManager(), pages);
        viewPager.setAdapter(adapter);
        viewPager.setCurrentItem(0);
        viewPagerTab.setViewPager(viewPager);
        viewPagerTab.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                super.onPageSelected(position);
            }
        });
        return view;
    }

    @Override
    public View createTabView(ViewGroup container, int position, PagerAdapter adapter) {
        LayoutInflater inflater = LayoutInflater.from(container.getContext());
        View tab = inflater.inflate(R.layout.custom_tab_icon_and_notification_mark, container, false);
        TextView txtTab = tab.findViewById(R.id.txtTitle);
        switch (position) {
            case 0:
                txtTab.setText(getResources().getString(R.string.pending_tab_text));
                break;
            case 1:
                txtTab.setText(getResources().getString(R.string.confirmed_tab_text));
                break;
            case 2:
                txtTab.setText(getResources().getString(R.string.cancelled_tab_text));
                break;
            case 3:
                txtTab.setText(getResources().getString(R.string.completed_tab_text));
                break;
            default:
                throw new IllegalStateException("Invalid pos - " + position);
        }
        return tab;
    }
}

最后这是我的OrderListFragment

OrderListFragment.java

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_order_lists, container, false);
    recycler_view_order_list = view.findViewById(R.id.recycler_view_order_list); //declared outside
    emptyView = view.findViewById(R.id.empty_view);
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
    recycler_view_order_list.setItemAnimator(new DefaultItemAnimator());
    recycler_view_order_list.setLayoutManager(mLayoutManager);
    loadOrders();
    return view;
}

public void loadOrders() {
    if (recycler_view_order_list != null) {
        recycler_view_order_list.setHasFixedSize(true);
    }
    final DatabaseReference orderTableRef = Global.getDatabase().getReference(Constants.ORDERS_TABLE);
    final DatabaseReference customerRef = Global.getDatabase().getReference(Constants.CUSTOMERS_TABLE);
    orderTableRef.keepSynced(true);
    customerRef.keepSynced(true);

    final Query orderList = orderTableRef.orderByChild("status").equalTo("Pending"); 
    //I hardcoded Pending value to make sure everything looks good.

    Global.adapter = new FirebaseRecyclerAdapter<Order, OrderItemHolder>(
            Order.class,
            R.layout.order_item_view,
            OrderItemHolder.class,
            orderList
    ) {
        @Override
        protected void populateViewHolder(final OrderItemHolder viewHolder, final Order model, final int position) {
            if(model.getCustId()!=null) {
                customerRef.child(model.getCustId()).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        Customers customers = dataSnapshot.getValue(Customers.class);
                        //set Customer name

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

                if ("Pending".equals(model.getStatus())) {
                     //Some UI updates for Pending
                }
                if ("Completed".equals(model.getStatus())) {
                    //Some UI updates for Pending
                }
                if ("Cancelled".equals(model.getStatus())) {
                    //Some UI updates for Pending
                }
                if ("Confirmed".equals(model.getStatus())) {
                    //Some UI updates for Pending
                }
            }
        }
    };

    orderTableRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (!dataSnapshot.hasChildren())
                emptyView.setVisibility(View.VISIBLE);
            else
                emptyView.setVisibility(View.GONE);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    RecyclerView.AdapterDataObserver mObserver = new RecyclerView.AdapterDataObserver() {
        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
            emptyView.setVisibility(View.GONE);
        }

        @Override
        public void onItemRangeRemoved(int positionStart, int itemCount) {
            if (Global.adapter.getItemCount() == 0)
                emptyView.setVisibility(View.VISIBLE);
            else
                emptyView.setVisibility(View.GONE);
        }
    };
    Global.adapter.registerAdapterDataObserver(mObserver);
    recycler_view_order_list.setAdapter(Global.adapter);
}

很长的代码,但我已经尽可能地缩短了代码。我在这里遇到了几个问题。

  • 即使在orderList中提取数据,也不会显示数据。在调试时,它永远不会达到populateViewHolder的{​​{1}}。当我对此问题进行一些研究时,我发现只需要添加FirebaseRecyclerAdapter并将其注册到我已经实施的RecyclerView.AdapterDataObserver。我仍然感到困惑,因为没有提取数据。 Global.adapter无论如何addListenerForSingleValueEvent点击orderTableRefif (!dataSnapshot.hasChildren())条件评估为false,从而隐藏emptyView消息。 GitHub问题中的一些建议也表示要移除recycler_view_order_list.setHasFixedSize(true);,但它也没有帮助。

    • 如何为不同的标签传递不同的订单状态?我在下面尝试过:

HomeTabFragment.java

Bundle bundle=new Bundle();
bundle.putString("orderType","Pending");
pages.add(FragmentPagerItem.of("Pending", OrderListsFragment.class,bundle));
bundle.putString("orderType","Confirmed");
pages.add(FragmentPagerItem.of("Confirmed", OrderListsFragment.class,bundle));
bundle.putString("orderType","Cancelled");
pages.add(FragmentPagerItem.of("Cancelled",OrderListsFragment.class,bundle));
bundle.putString("orderType","Completed");
pages.add(FragmentPagerItem.of("Completed", OrderListsFragment.class,bundle));

覆盖FragmentPagerItems的{​​{1}}方法,并为同一add传递不同值的budnle,但最后在每次初始化时都传递了最后一个值,即key

注意 - Completed是一个实用程序扩展,可以使用选项卡库。

有人能指出我在正确的方向吗?

0 个答案:

没有答案