如果我将 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/