android - 改编自 Firestore 的 Recyclerview 未出现在 Fragment 上(带标签)

标签 android firebase android-fragments android-recyclerview google-cloud-firestore

如果我将 Recyclerview(从 Firestore 加载)加载到 Activity 上,它就会工作。

我刚刚向我的 ConstraintLayout 添加了一个 TabLayout 和一个 ViewPager:

   <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        app:layout_constraintTop_toBottomOf="@id/storeIDLayout"
        >
        <android.support.design.widget.TabItem
            android:id="@+id/tabItem"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TEST 1" />
        <android.support.design.widget.TabItem
            android:id="@+id/tabItem2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="test 2" />
    </android.support.design.widget.TabLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintTop_toBottomOf="@+id/tabs"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

并将 RecyclerView 移出到 fragment.xml 中:

<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/ConstraintLayout"
>

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_prodlist"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    app:layout_constraintBottom_toBottomOf="@+id/ConstraintLayout"
    app:layout_constraintLeft_toLeftOf="@+id/ConstraintLayout"
    app:layout_constraintRight_toRightOf="@+id/ConstraintLayout"
    tools:listitem="@layout/item_addorders" />

</android.support.constraint.ConstraintLayout>

问题: 在 Activity 中,我有这个:

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

    if (mAdapter != null) {
        mAdapter.startListening();
    }
}

@Override
public void onStop() {
    super.onStop();
    if (mAdapter != null) {
        mAdapter.stopListening();
    }
}

我应该把它插入到我的 fragment 中的什么地方?

第二个问题:

我的 fragment 似乎是空的。如果我取消注释 Textview (R.id.section_label) - textview 工作正常。但是 recyclerview 没有出现。知道为什么吗?

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return PlaceholderFragment.newInstance(position + 1);
    }

    @Override
    public int getCount() {
        // Show 3 total pages.
        return 3;
    }
}

public static class PlaceholderFragment extends Fragment {
    private static final String ARG_SECTION_NUMBER = "section_number";

    public PlaceholderFragment() {
    }

    public static PlaceholderFragment newInstance(int sectionNumber) {
        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_add_new_order, container, false);

        FirebaseFirestore mFirestore;
        Query mQuery;
        AddOrderAdapter mAdapter;

        RecyclerView mAddOrderRecycler = rootView.findViewById(R.id.recycler_prodlist);
        mAddOrderRecycler.setLayoutManager(new LinearLayoutManager(this.getActivity()));

        mFirestore = FirebaseFirestore.getInstance();

        mQuery = mFirestore
                .collection("PROD")
                .document("TEST")
                .collection("Items")
                .orderBy("Name", Query.Direction.ASCENDING);
        mAdapter = new AddOrderAdapter(mQuery, getActivity());

        mAddOrderRecycler.setAdapter(mAdapter);

        //TextView textView = (TextView) rootView.findViewById(R.id.section_label);
        //textView.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER)));

        return rootView;
    }
}

编辑以包含模型:

import com.google.firebase.firestore.IgnoreExtraProperties;

@IgnoreExtraProperties
public class AddOrderProductList {
    private String Barcode;
    private String ImageURL;
    private String Name;
    private String Unit;

    public AddOrderProductList() {}

    public String getBarcode() {
        return Barcode;
    }

    public String getImageURL() {
        return ImageURL;
    }

    public String getName() {
        return Name;
    }

    public String getUnit() {
        return Unit;
    }

    public AddOrderProductList(String barcode, String imageURL, String name, String unit) {
        Barcode = barcode;
        ImageURL = imageURL;
        Name = name;
        Unit = unit;
    }
}

第二次编辑:

import com.google.firebase.firestore.IgnoreExtraProperties;

@IgnoreExtraProperties
public class AddOrderProductList {
    private String barcode;
    private String imageURL;
    private String name;
    private String unit;

    public AddOrderProductList() {}

    public String getBarcode() {
        return barcode;
    }

    public String getImageURL() {
        return imageURL;
    }

    public String getName() {
        return name;
    }

    public String getUnit() {
        return unit;
    }

    public AddOrderProductList(String barcode, String imageURL, String name, String unit) {
        this.barcode = barcode;
        this.imageURL = imageURL;
        this.name = name;
        this.unit = unit;
    }
}

数据库结构:

PROD -> TEST -> Items -> Document of items with fields:

"Barcode" - String
"Name" - String
"Unit" - String
"ImageURL" - String

最佳答案

第一个问题的答案很简单:

Where do I insert this in my fragment?

正如您在 Activity 类中所做的那样并且它有效,在您的 fragment 类中也这样做。覆盖 onStart()onStop() 方法并开始/停止监听变化。另外,在onStart()方法中,不需要检查是否为空,直接使用mAdapter.startListening();即可。

关于你的第二个问题,当你用 id section_label 评论 View 并​​且它起作用时,这很可能是因为你的 View 的宽度和宽度都设置为 match_parent高度,在术语中意味着它占据了您 View 的所有总空间。

关于您的模型类,您还需要记住一件事。当 Firebase 实时数据库 SDK 反序列化来自数据库的对象时,正在寻找遵循 JavaBeans 原则并根据 Java Naming Conventions 命名的字段。 .因此,模型类中的字段应命名为 barcode 而不是 Barcode,并使用相应的 getter getBarcode()。您的模型类应该如下所示:

public class AddOrderProductList {
    private String barcode;
    private String imageURL;
    private String name;
    private String unit;

    public AddOrderProductList() {}

    public AddOrderProductList(String barcode, String imageURL, String name, String unit) {
        this.barcode = barcode;
        this.imageURL = imageURL;
        this.name = name;
        this.unit = unit;
    }

    public String getBarcode() {return barcode;}
    public String getImageURL() {return imageURL;}
    public String getName() {return name;}
    public String getUnit() {return unit;}
}

关于android - 改编自 Firestore 的 Recyclerview 未出现在 Fragment 上(带标签),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49490638/

相关文章:

android - 如何从 SupportMapFragment 扩展的 fragment 中获取主 Activity

android - 如何为 LinearLayout 中的 Fragments 分配比例尺寸?

javascript - Firebase 事务错误 : [Error: Set]

android - html 中输入的最大长度属性在 HTC One M7 上不起作用

java - 如何允许多个用户访问 facebook api

android - mGoogleApiClient.connect(); 时应用崩溃叫做

android manifest 合并失败,gms play services/firebase

ios - 查看 Controller 关闭问题

android - 工具栏的向上插入符号打开导航菜单

java - 关闭预览模式时,动态壁纸引擎不会调用 onDestroy