我的带有FirebaseRecyclerAdapter的RecyclerView在屏幕上不显示任何内容

问题描述 投票:-1回答:1

我不确定为什么RecyclerView没有在UI上显示任何图像或数据。

JSON Structure of Firebase database

这是我的Firebase数据库表的结构图

category fragment.Java

这是我使用FirebaseRecyclerAdapter配置RecyclerView的片段。在这里,我认为错误在哪里,但我找不到它。

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.example.abdullah.livewallpapers.Interface.ItemClickListener;
import com.example.abdullah.livewallpapers.Model.CategoryItem;
import com.example.abdullah.livewallpapers.R;
import com.example.abdullah.livewallpapers.Viewholder.CategoryViewholder;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.squareup.picasso.Callback;
import com.squareup.picasso.NetworkPolicy;
import com.squareup.picasso.Picasso;
import java.util.List;

/**
  * A simple {@link Fragment} subclass.
*/
public class CategoryFragment extends Fragment {

private static final String STR_CATEGORY_BACKGROUND = "CategoryBackground";
DatabaseReference categoryBackground;
FirebaseDatabase database;

FirebaseRecyclerOptions<CategoryItem> options;
FirebaseRecyclerAdapter<CategoryItem,CategoryViewholder> adapter;

RecyclerView recyclerView;

private static CategoryFragment INSTANCE = null;

public CategoryFragment() {

    database = FirebaseDatabase.getInstance();
    categoryBackground = database.getReference(STR_CATEGORY_BACKGROUND);

    options = new FirebaseRecyclerOptions.Builder<CategoryItem>()
            .setQuery(categoryBackground,CategoryItem.class)
            .build();

    adapter = new FirebaseRecyclerAdapter<CategoryItem, CategoryViewholder>(options) {
        @Override
        protected void onBindViewHolder(@NonNull final CategoryViewholder holder, int position, @NonNull final CategoryItem model) {


            Picasso.with(getActivity())
                    .load(model.getImageLink())
                    .networkPolicy(NetworkPolicy.OFFLINE)
                    .into(holder.backgroud_image, new Callback(){
                        @Override
                        public void onSuccess() {

                        }

                        @Override
                        public void onError() {

                            Picasso.with(getActivity())
                                    .load(model.getImageLink())
                                    .error(R.drawable.ic_terrain_black_24dp)
                                    .into(holder.backgroud_image, new Callback() {
                                        @Override
                                        public void onSuccess() {

                                        }

                                        @Override
                                        public void onError() {

                                            Log.i("category_error","error comes");
                                        }
                                    });
                        }
                    } );

            holder.category_name.setText(model.getName());

            holder.setItemClickListener(new ItemClickListener() {
                @Override
                public void onClick(View view, int postion) {

                }
            });
        }

        @NonNull
        @Override
        public CategoryViewholder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

            View itemView = LayoutInflater.from(viewGroup.getContext())
                    .inflate(R.layout.layout_category_item,viewGroup,false);

            return new CategoryViewholder(itemView);
        }
    };
}

private void setCategory() {
    adapter.startListening();
    recyclerView.setAdapter(adapter);
}

@Override
public void onStart() {
    super.onStart();
    if (adapter!=null)
    adapter.startListening();
}

@Override
public void onStop() {

    super.onStop();
    if (adapter!=null)
        adapter.stopListening();
}

@Override
public void onResume() {
    super.onResume();
    if (adapter!=null)
        adapter.startListening();
}

public static CategoryFragment getInstance() {

    if (INSTANCE == null)
        INSTANCE = new CategoryFragment();
    return INSTANCE;
}


@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_category, container, false);
    recyclerView = (RecyclerView)view.findViewById(R.id.category_recyclerview);
    recyclerView.setHasFixedSize(true);
    GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(),2);
    recyclerView.setLayoutManager(gridLayoutManager);
    setCategory();

    return view;
}

}

CategoryItem

public class CategoryItem {
    public String Name;
    public String ImageLink;
    public CategoryItem() {
    }

    public CategoryItem(String name, String imageLink) {
        Name = name;
        ImageLink = imageLink;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public String getImageLink() {
        return ImageLink;
    }

    public void setImageLink(String imageLink) {
        ImageLink = imageLink;
    }
}

来自Logcat的错误

这些是logcat中出现的错误。

com.google.firebase.database.DatabaseException: Found two getters or fields with conflicting case sensitivity for property: imagelink
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.addProperty(com.google.firebase:firebase-database@@16.0.6:545)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.<init>(com.google.firebase:firebase-database@@16.0.6:476)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.loadOrCreateBeanMapperForClass(com.google.firebase:firebase-database@@16.0.6:317)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(com.google.firebase:firebase-database@@16.0.6:418)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(com.google.firebase:firebase-database@@16.0.6:214)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(com.google.firebase:firebase-database@@16.0.6:79)
        at com.google.firebase.database.DataSnapshot.getValue(com.google.firebase:firebase-database@@16.0.6:212)
        at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:29)
        at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:15)
        at com.firebase.ui.common.BaseCachingSnapshotParser.parseSnapshot(BaseCachingSnapshotParser.java:35)
        at com.firebase.ui.common.BaseObservableSnapshotArray.get(BaseObservableSnapshotArray.java:52)
        at com.firebase.ui.database.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:106)
        at com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:122)
        at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781)
        at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823)
        at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5752)
        at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6019)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
        at android.support.v7.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:557)
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
        at android.support.v7.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:171)
        at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924)
        at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3641)
        at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1888)
        at android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:407)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
        at android.view.Choreographer.doCallbacks(Choreographer.java:555)
        at android.view.Choreographer.doFrame(Choreographer.java:524)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
        at android.os.Handler.handleCallback(Handler.java:615)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4960)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
        at dalvik.system.NativeStart.main(Native Method)
V/FA: Activity resumed, time: 5548276
I/Process: Sending signal. PID: 8700 SIG: 9
Application terminated.
java android firebase firebase-realtime-database firebaseui
1个回答
0
投票

您的POJO通过公开公开属性和具有相同名称的getter来混淆Firebase SDK:imageLink

public class CategoryItem {
    public String ImageLink;

    // ...

    public String getImageLink() {
        return ImageLink;
    }

    // ...    
}

它不知道使用哪一个,因为它们具有相同的名称。你应该做的是将字段设为私有,并将访问者公开,因此没有两个具有相同名称的公共事物:

public class CategoryItem {
    private String Name;
    private String ImageLink;
    // ...
}

这是创建POJO类型对象的标准方法。

© www.soinside.com 2019 - 2024. All rights reserved.