Java Recyclerview为textview引发nullexception错误

Java Recyclerview为textview引发nullexception错误,java,android,firebase,firebase-realtime-database,android-recyclerview,Java,Android,Firebase,Firebase Realtime Database,Android Recyclerview,编辑: 我正试图从firebase中填充firebase recyclerview,看起来一切都很好,但在填充textview时,它抛出了 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence) at com.example.cyrenians.cyreniansprototypenew.DummyF

编辑: 我正试图从firebase中填充firebase recyclerview,看起来一切都很好,但在填充textview时,它抛出了

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)
at com.example.cyrenians.cyreniansprototypenew.DummyFragment$1.onBindViewHolder(DummyFragment.java:64)
                      at com.example.cyrenians.cyreniansprototypenew.DummyFragment$1.onBindViewHolder(DummyFragment.java:55)
                      at com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:118)
                      at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6482)
                      at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6515)
                      at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5458)
                      at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5724)
                      at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5563)
                      at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5559)
                      at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2229)
                      at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1556)
                      at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1516)
                      at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:608)
                      at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3693)
                      at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:3109)
                      at android.view.View.measure(View.java:22002)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
                      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
                      at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
                      at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
                      at android.view.View.measure(View.java:22002)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
                      at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                      at android.view.View.measure(View.java:22002)
                      at android.support.constraint.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:934)
                      at android.support.constraint.ConstraintLayout.onMeasure(ConstraintLayout.java:973)
                      at android.view.View.measure(View.java:22002)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
                      at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                      at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
                      at android.view.View.measure(View.java:22002)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
                      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
                      at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
                      at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
                      at android.view.View.measure(View.java:22002)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
                      at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                      at android.view.View.measure(View.java:22002)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
                      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
                      at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
                      at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
                      at android.view.View.measure(View.java:22002)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
                      at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                      at com.android.internal.policy.DecorView.onMeasure(DecorView.java:721)
                      at android.view.View.measure(View.java:22002)
                      at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2410)
                      at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1498)
E/AndroidRuntime:     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1751)
                      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1386)
                      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6733)
                      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
                      at android.view.Choreographer.doCallbacks(Choreographer.java:723)
                      at android.view.Choreographer.doFrame(Choreographer.java:658)
                      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
                      at android.os.Handler.handleCallback(Handler.java:789)
                      at android.os.Handler.dispatchMessage(Handler.java:98)
                      at android.os.Looper.loop(Looper.java:164)
                      at android.app.ActivityThread.main(ActivityThread.java:6541)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
这是我的片段类

public class DummyFragment extends android.support.v4.app.Fragment {
private FirebaseRecyclerAdapter<Product, ProductViewHolder> mFirebaseAdapter;
private RecyclerView mProduceList = null;

public Context c;
private LinearLayoutManager manager;

public DummyFragment() {
}

public static DummyFragment newInstance() {
    DummyFragment fragment = new DummyFragment();
    return fragment;
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    View itemView = inflater.inflate(R.layout.dummy_fragment, container, false);
    FirebaseApp.initializeApp(c);
    mProduceList = itemView.findViewById(R.id.recyclerView);
    mProduceList.setLayoutManager(new LinearLayoutManager(getActivity()));
    DatabaseReference productRef = FirebaseDatabase.getInstance().getReference().child("Products");
    Query productQuery = productRef.orderByKey();

    FirebaseRecyclerOptions productOptions = new FirebaseRecyclerOptions.Builder<Product>().setQuery(productQuery, Product.class).build();

    mFirebaseAdapter = new FirebaseRecyclerAdapter<Product, ProductViewHolder>(productOptions) {
        @Override
        public ProductViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
            return new ProductViewHolder(inflater.inflate(R.layout.dummy_fragment, parent, false));
        }

        @Override
        protected void onBindViewHolder(ProductViewHolder viewHolder, int position, Product product) {
            viewHolder.post_name.setText(product.getTitle());
            viewHolder.post_type.setText(product.getDesc());
        }
    };

    mProduceList.setAdapter(mFirebaseAdapter);
    return itemView;
}

@Override
public void onStart() {
    super.onStart();
    mFirebaseAdapter.startListening();
}

@Override
public void onStop() {
    super.onStop();
    mFirebaseAdapter.stopListening();
}

public static class ProductViewHolder extends RecyclerView.ViewHolder {

    View mView;
    TextView post_name;
    TextView post_type;

    public ProductViewHolder(View itemView) {
        super(itemView);
        mView = itemView;
        post_name = (TextView) mView.findViewById(R.id.productTitle);
        post_type = (TextView) mView.findViewById(R.id.productDesc);
    }

    public void setTitle(String title) {
        post_name.setText(title);
    }

    public void setDesc(String desc) {
        post_type.setText(desc);
    }
}
}
我不确定我的模型类是否设置正确,也不确定我的viewholder是否正确。我是Firebase的新手,我真的很难处理这个回收视图,所以如果有人能提供解决方案,我将不胜感激。 这里是布局

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/cardView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="10dp"
>
<LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/product"
        android:paddingLeft="10dp"
        android:layout_width="70sp"
        android:layout_height="70sp" />
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/productTitle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Card Title"
            android:textColor="#000000"
            android:textSize="15sp"
            android:paddingTop="13dp"
            android:paddingLeft="20dp"
            android:textStyle="bold"/>
        <TextView
            android:id="@+id/productDesc"
            android:layout_width="fill_parent"
            android:paddingLeft="20dp"
            android:layout_height="wrap_content" />
    </LinearLayout>
</LinearLayout>


更改此选项:

viewHolder.post_name.setText(product.getTitle());
viewHolder.post_type.setText(product.getDesc());
为此:

viewHolder.setTitle(product.getTitle());
viewHolder.setDesc(product.getDesc());

当我在
dimens.xml
中使用dimen值而不使用
dp
时,出现了此错误。范例

<dimen name="dp_50">50</dimen>
50
这看起来很奇怪,因为应用程序仍然构建成功,并且错误消息看起来不相关

要解决问题,只需更改为

<dimen name="dp_50">50dp</dimen>
50dp

希望它能帮助任何人检查R.layout.dummy_片段中的文本视图id。您已为fragment和recyclerview项扩展了相同的布局。请同时添加布局代码。是否确定id productTitle存在于此布局虚拟\u片段中?它们显示在cardview中,虚拟\u片段包含recyclerviewonly@redberry您在哪里指定了recyclerview的项目布局?您能解释一下这个代码吗。。。?怎么可能呢。@PeterHaddad你能给我解释一下它如何知道需要为哪个视图设置文本吗?@PeterHaddad你能解释一下吗。我也不明白这一点,它如何知道哪个文本视图set@VishvaDave没有setText(),holder类有两个方法settitle和setDesc,要在onbindviewholder中访问这些方法,您需要使用object.settitle()和object.setDesc()。答案是100%正确的,它被否决是愚蠢的,可能是一个不懂的人
<dimen name="dp_50">50</dimen>
<dimen name="dp_50">50dp</dimen>