populateViewHolder不能用FirebaseRecyclerAdapter执行(Android) [英] populateViewHolder not executing with FirebaseRecyclerAdapter (Android)

查看:354
本文介绍了populateViewHolder不能用FirebaseRecyclerAdapter执行(Android)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正尝试使用FirebaseRecyclerAdapter 来使用Firebase数据库中的数据填充片段中的RecyclerView。



我的主要问题是 populateViewHolder 方法永远不会被调用,所以在 RecyclerView



我遵循 Firebase UI



https://github.com/firebase/FirebaseUI-Android/blob/master/database/README.md



规则在我的Firebase数据库上:

  {
rules:{
.read: true,
.write:true
}
}

在我的 gradle 中,我添加了这个依赖项:

  compile'c​​om。 firebaseui:firebase-ui-database:0.4.1'

这是 onCreateView 方法在我的片段:

  public查看onCreateView(LayoutInflater inflater, ViewGroup容器,
Bundled savedInstanceState){
查看rootView = inflater.inflate(R.layout.fragment_dev_list,container,false);

Log.d(ROOT_VIEW,rootView.toString());

mRecyclerView =(RecyclerView)rootView.findViewById(R.id.recycler_view);
Log.d(RECYCLER_VIEW,mRecyclerView.toString());

mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(新的LinearLayoutManager(getActivity()));
Log.d(ITEM_RECYCLER,Integer.toString(mRecyclerView.getLayoutManager()。getItemCount()));

DatabaseReference devs = FirebaseDatabase.getInstance()。getReference()。child(users)。child(devs);

FirebaseRecyclerAdapter< Developer,DeveloperViewHolder>适配器=
新的FirebaseRecyclerAdapter< Developer,DeveloperViewHolder>(
Developer.class,
R.layout.dev_list_row,
DeveloperViewHolder.class,
devs
) {
@Override
protected void populateViewHolder(DeveloperViewHolder viewHolder,Developer developer,int position){
Log.d(ON CREATE VIEW,before);
viewHolder.setFirstName(developer.getFirstN());
viewHolder.setLastName(developer.getLastN());
viewHolder.setAddress(developer.getAddress());
Log.d(ON CREATE VIEW,populate);
}
};

$ b Log.d(COUNT_ADAPTER,Integer.toString(adapter.getItemCount()));
Log.d(ADAPTER,adapter.toString());
Log.d(RECYCLER VIEW,mRecyclerView.toString());
mRecyclerView.setAdapter(adapter);
Log.d(ON CREATE VIEW,end);

return rootView;

以下是我的 DeveloperViewHolder 类:

  public static class DeveloperViewHolder extends RecyclerView.ViewHolder {
TextView firstName;
TextView lastName;
TextView地址;
查看mView;


public DeveloperViewHolder(View v){
super(v);
this.mView = v;

$ b $ public void setFirstName(String firstN){
this.firstName =(TextView)mView.findViewById(R.id.firstname_row);
this.firstName.setText(firstN);

$ b $ public void setLastName(String lastN){
this.lastName =(TextView)mView.findViewById(R.id.lastname_row);
this.lastName.setText(lastN);

$ b $ public void setAddress(String addr){
this.address =(TextView)mView.findViewById(R.id.address_row);
this.address.setText(addr);

$ b

开发者类模型类):

  public class Developer {

private String firstN;
私人字符串lastN;
私人字符串电子邮件;
私有字符串地址;

公共开发者(){

}

公共开发者(字符串firstN,字符串lastN,字符串电子邮件,字符串地址){
this.firstN = firstN;
this.lastN = lastN;
this.email = email;
this.address = address;
}

public String getFirstN(){
return firstN;
}

public void setFirstN(String firstN){
this.firstN = firstN;
}

public String getLastN(){
return lastN;


public void setLastN(String lastN){
this.lastN = lastN;
}

public String getEmail(){
return email;
}

public void setEmail(String email){
this.email = email;
}

public String getAddress(){
return address;

$ b $ public void setAddress(String address){
this.address = address;




$ b $ p $最后,一些日志



$ $ p $ [07-08 09:42:42.773 18621:18668 D /]
HostConnection :: get )建立新主机连接0x7f938cdb65c0,tid 18668
I / OpenGLRenderer:初始化EGL,版本1.4
D / OpenGLRenderer:启用调试模式0
I / TextInputLayout:添加的EditText不是TextInputEditText。请切换到使用该类。
I / TextInputLayout:添加的EditText不是TextInputEditText。请切换到使用该类。
我/ AppCompatViewInflater:应用程序:主题现已被弃用。请改为使用android:主题。
D / ACTION BAR?:android.support.v7.app.ToolbarActionBar@23efcd8a
D / ROOT_VIEW:android.widget.LinearLayout {27403c65 V.E ..... ...... I。 0,0-0,0}
D / RECYCLER_VIEW:android.support.v7.widget.RecyclerView {23dead3a VFED.V .. ...... I。 0,0-0,0#7f0e00e5 app:id / recycler_view}
D / ITEM_RECYCLER:0
I / DynamiteModule:考虑到本地模块com.google.android.gms.firebase_database:2和远程模块com .google.android.gms.firebase_database:2
I / DynamiteModule:选定的远程版本com.google.android.gms.firebase_database,版本> = 2
D / COUNT_ADAPTER:0
D / ADAPTER:raphaelgrau.example.com.tabsapp.fragment.tabs.DevListFragment$1@29ec2dc7
D / RECYCLER VIEW:android.support.v7.widget.RecyclerView {23dead3a VFED.V .. ..... 。一世。 0,0-0,0#7f0e00e5 app:id / recycler_view}
D / ON CREATE VIEW:end
E / DynamiteModule:无法加载模块描述符类:找不到类com.google .android.gms.dynamite.descriptors.com.google.firebase.auth.ModuleDescriptoron path:DexPathList [[zip file'/data/app/raphaelgrau.example.com.tabsapp-1/base.apk\"],nativeLibraryDirectories = [/ vendor / lib64,/ system / lib64]]
background_crash E / DynamiteModule:无法加载模块描述符类:未找到类com.google.android.gms.dynamite.descriptors.com.google .android.gms.crash.ModuleDescriptoron path:DexPathList [[zip file'/data/app/raphaelgrau.example.com.tabsapp-1/base.apk\"],nativeLibraryDirectories=[/vendor/lib64,/ system / lib64]]
background_crash W / ResourcesManager:资产路径/system/framework/com.android.media.remotedisplay.jar不存在或不包含任何资源。
background_crash W / ResourcesManager:资产路径/system/framework/com.android.location.provider.jar不存在或不包含任何资源。
background_crash W / ResourcesManager:资产路径/system/framework/com.android.media.remotedisplay.jar不存在或不包含任何资源。
background_crash W / ResourcesManager:资产路径/system/framework/com.android.location.provider.jar不存在或不包含任何资源。
background_crash D / ChimeraCfgMgr:读取存储的模块配置
background_crash I / DynamiteModule:考虑到本地模块com.google.android.gms.crash:0和远程模块com.google.android.gms.crash:2
background_crash I / DynamiteModule:所选的远程版本com.google.android.gms.crash,版本> = 2
background_crash D / ChimeraFileApk:请求进程的主ABI为x86_64
background_crash I / art:DexFile_isDexOptNeeded未能打开燕麦文件'/data/dalvik-cache/x86_64/data@data@com.google.android.gms@app_chimera@m@00000002@DynamiteModulesC_GmsCore_prodlmp_alldpi_release.apk@classes.dex'用于文件位置'/ data / data / com.google.android.gms / app_chimera / m / 00000002 / DynamiteModulesC_GmsCore_prodlmp_alldpi_release.apk':打开oat文件名失败:没有这样的文件或目录
background_crash D / ChimeraFileApk:类加载成功。找到优化的代码。
background_crash I / FirebaseCrashReceiverServiceImpl:由ClassLoader创建的FirebaseCrashReceiverServiceImpl com.google.android.chimera.container.internal.DelegateLastPathClassLoader [DexPathList [[zip文件] /data/data/com.google.android.gms/app_chimera/m/ 00000002 / DynamiteModulesC_GmsCore_prodlmp_alldpi_release.apk],nativeLibraryDirectories = [/ vendor / lib64,/ system / lib64]]]
background_crash D / FirebaseCrashReceiverServiceImpl:onCreate
background_crash I / DynamiteModule:考虑到本地模块com.google.android .gms.flags:0和远程模块com.google.android.gms.flags:1
background_crash I / DynamiteModule:所选远程版本的com.google.android.gms.flags,版本> = 1
background_crash I / FirebaseCrashSenderServiceImpl:由ClassLoader创建的FirebaseCrashSenderServiceImpl com.google.android.chimera.container.internal.DelegateLastPathClassLoader [DexPathList [[zip文件/data/data/com.google.android.gms/app_chimera/m/00000002/ DynamiteModulesC_GmsCore_prodlm
background_crash D / FirebaseCrashSenderServiceImpl:onCreate


解决方案

我解决了我的问题,感谢这个文档: ://codelabs.developers.google.com/codelabs/firebase-android/#6rel =nofollow> https://codelabs.developers.google.com/codelabs/firebase-android/#6

我需要添加 RecyclerView.AdapterDataObserver()



pre $ mFirebaseAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver(){
@Override
public void onItemRangeInserted(int positionStart,int itemCount){
super .onItemRangeInserted(positionStart,itemCount);
int friendlyMessageCount = mFirebaseAdapter.getItemCount();
int lastVisiblePosition =
mLinearLayoutManager.findLastCompletelyVisibleItemPosition();
//如果回收者视图最初被加载,或者
//用户位于列表的底部,则滚动到列表的底部
//以显示新添加的消息。
if(lastVisiblePosition == -1 ||
(positionStart> =(friendlyMessageCount - 1)&&
lastVisiblePosition ==(positionStart - 1))){
mMessageRecyclerView.scrollToPosition(positionStart);
}
}
});

问题解决了!

I'm trying to use a FirebaseRecyclerAdapterto populate a RecyclerView in a fragment, with data from my Firebase database.

My main problem is that the populateViewHoldermethod is never called, so I got nothing displaying in the RecyclerView.

I followed the steps from the Firebase UIdocumentation :

https://github.com/firebase/FirebaseUI-Android/blob/master/database/README.md

The rules on my Firebase database :

{
  "rules": {
    ".read": "true",
    ".write": "true"
  }
}

In my gradle, I've added this dependency :

compile 'com.firebaseui:firebase-ui-database:0.4.1'

Here's the onCreateView method in my fragment :

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_dev_list, container, false);

    Log.d("ROOT_VIEW", rootView.toString());

    mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);
    Log.d("RECYCLER_VIEW", mRecyclerView.toString());

    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    Log.d("ITEM_RECYCLER", Integer.toString(mRecyclerView.getLayoutManager().getItemCount()));

    DatabaseReference devs = FirebaseDatabase.getInstance().getReference().child("users").child("devs");

    FirebaseRecyclerAdapter<Developer, DeveloperViewHolder> adapter =
            new FirebaseRecyclerAdapter<Developer, DeveloperViewHolder>(
                    Developer.class,
                    R.layout.dev_list_row,
                    DeveloperViewHolder.class,
                    devs
            ) {
                @Override
                protected void populateViewHolder(DeveloperViewHolder viewHolder, Developer developer, int position) {
                    Log.d("ON CREATE VIEW", "before");
                    viewHolder.setFirstName(developer.getFirstN());
                    viewHolder.setLastName(developer.getLastN());
                    viewHolder.setAddress(developer.getAddress());
                    Log.d("ON CREATE VIEW", "populate");
                }
            };


    Log.d("COUNT_ADAPTER", Integer.toString(adapter.getItemCount()));
    Log.d("ADAPTER", adapter.toString());
    Log.d("RECYCLER VIEW", mRecyclerView.toString());
    mRecyclerView.setAdapter(adapter);
    Log.d("ON CREATE VIEW", "end");

    return rootView;
} 

And here's my DeveloperViewHolder class :

public static class DeveloperViewHolder extends RecyclerView.ViewHolder {
    TextView firstName;
    TextView lastName;
    TextView address;
    View mView;


    public DeveloperViewHolder(View v) {
        super(v);
        this.mView = v;
    }

    public void setFirstName(String firstN) {
        this.firstName = (TextView) mView.findViewById(R.id.firstname_row);
        this.firstName.setText(firstN);
    }

    public void setLastName(String lastN) {
        this.lastName = (TextView) mView.findViewById(R.id.lastname_row);
        this.lastName.setText(lastN);
    }

    public void setAddress(String addr) {
        this.address = (TextView) mView.findViewById(R.id.address_row);
        this.address.setText(addr);
    }
}

The Developer class (model class) :

public class Developer {

    private String firstN;
    private String lastN;
    private String email;
    private String address;

        public Developer() {

        }

    public Developer(String firstN, String lastN, String email, String address)     {
        this.firstN = firstN;
        this.lastN = lastN;
        this.email = email;
        this.address = address;
    }

    public String getFirstN() {
        return firstN;
    }

    public void setFirstN(String firstN) {
        this.firstN = firstN;
    }

    public String getLastN() {
        return lastN;
    }

    public void setLastN(String lastN) {
        this.lastN = lastN;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

And finally, some logs :

[ 07-08 09:42:42.773 18621:18668 D/         ]
                                                                          HostConnection::get() New Host Connection established 0x7f938cdb65c0, tid 18668
I/OpenGLRenderer: Initialized EGL, version 1.4
D/OpenGLRenderer: Enabling debug mode 0
I/TextInputLayout: EditText added is not a TextInputEditText. Please switch to using that class instead.
I/TextInputLayout: EditText added is not a TextInputEditText. Please switch to using that class instead.
I/AppCompatViewInflater: app:theme is now deprecated. Please move to using android:theme instead.
D/ACTION BAR?: android.support.v7.app.ToolbarActionBar@23efcd8a
D/ROOT_VIEW: android.widget.LinearLayout{27403c65 V.E..... ......I. 0,0-0,0}
D/RECYCLER_VIEW: android.support.v7.widget.RecyclerView{23dead3a VFED.V.. ......I. 0,0-0,0 #7f0e00e5 app:id/recycler_view}
D/ITEM_RECYCLER: 0
I/DynamiteModule: Considering local module com.google.android.gms.firebase_database:2 and remote module com.google.android.gms.firebase_database:2
I/DynamiteModule: Selected remote version of com.google.android.gms.firebase_database, version >= 2
D/COUNT_ADAPTER: 0
D/ADAPTER: raphaelgrau.example.com.tabsapp.fragment.tabs.DevListFragment$1@29ec2dc7
D/RECYCLER VIEW: android.support.v7.widget.RecyclerView{23dead3a VFED.V.. ......I. 0,0-0,0 #7f0e00e5 app:id/recycler_view}
D/ON CREATE VIEW: end
E/DynamiteModule: Failed to load module descriptor class: Didn't find class "com.google.android.gms.dynamite.descriptors.com.google.firebase.auth.ModuleDescriptor" on path: DexPathList[[zip file "/data/app/raphaelgrau.example.com.tabsapp-1/base.apk"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]
background_crash     E/DynamiteModule: Failed to load module descriptor class: Didn't find class "com.google.android.gms.dynamite.descriptors.com.google.android.gms.crash.ModuleDescriptor" on path: DexPathList[[zip file "/data/app/raphaelgrau.example.com.tabsapp-1/base.apk"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]
background_crash W/ResourcesManager: Asset path '/system/framework/com.android.media.remotedisplay.jar' does not exist or contains no resources.
background_crash W/ResourcesManager: Asset path '/system/framework/com.android.location.provider.jar' does not exist or contains no resources.
background_crash W/ResourcesManager: Asset path '/system/framework/com.android.media.remotedisplay.jar' does not exist or contains no resources.
background_crash W/ResourcesManager: Asset path '/system/framework/com.android.location.provider.jar' does not exist or contains no resources.
background_crash D/ChimeraCfgMgr: Reading stored module config
background_crash I/DynamiteModule: Considering local module com.google.android.gms.crash:0 and remote module com.google.android.gms.crash:2
background_crash I/DynamiteModule: Selected remote version of com.google.android.gms.crash, version >= 2
background_crash D/ChimeraFileApk: Primary ABI of requesting process is x86_64
background_crash I/art: DexFile_isDexOptNeeded failed to open oat file '/data/dalvik-cache/x86_64/data@data@com.google.android.gms@app_chimera@m@00000002@DynamiteModulesC_GmsCore_prodlmp_alldpi_release.apk@classes.dex' for file location '/data/data/com.google.android.gms/app_chimera/m/00000002/DynamiteModulesC_GmsCore_prodlmp_alldpi_release.apk': Failed to open oat filename for reading: No such file or directory
background_crash D/ChimeraFileApk: Classloading successful. Optimized code found.
background_crash I/FirebaseCrashReceiverServiceImpl: FirebaseCrashReceiverServiceImpl created by ClassLoader com.google.android.chimera.container.internal.DelegateLastPathClassLoader[DexPathList[[zip file "/data/data/com.google.android.gms/app_chimera/m/00000002/DynamiteModulesC_GmsCore_prodlmp_alldpi_release.apk"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]]
background_crash D/FirebaseCrashReceiverServiceImpl: onCreate
background_crash I/DynamiteModule: Considering local module com.google.android.gms.flags:0 and remote module com.google.android.gms.flags:1
background_crash I/DynamiteModule: Selected remote version of com.google.android.gms.flags, version >= 1
background_crash I/FirebaseCrashSenderServiceImpl: FirebaseCrashSenderServiceImpl created by ClassLoader com.google.android.chimera.container.internal.DelegateLastPathClassLoader[DexPathList[[zip file "/data/data/com.google.android.gms/app_chimera/m/00000002/DynamiteModulesC_GmsCore_prodlmp_alldpi_release.apk"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]]
background_crash D/FirebaseCrashSenderServiceImpl: onCreate

解决方案

I fixed my problem thanks to this doc :

https://codelabs.developers.google.com/codelabs/firebase-android/#6

I needed to add a RecyclerView.AdapterDataObserver() :

mFirebaseAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
   @Override
   public void onItemRangeInserted(int positionStart, int itemCount) {
       super.onItemRangeInserted(positionStart, itemCount);
       int friendlyMessageCount = mFirebaseAdapter.getItemCount();
       int lastVisiblePosition =
              mLinearLayoutManager.findLastCompletelyVisibleItemPosition();
       // If the recycler view is initially being loaded or the 
       // user is at the bottom of the list, scroll to the bottom 
       // of the list to show the newly added message.
       if (lastVisiblePosition == -1 ||
               (positionStart >= (friendlyMessageCount - 1) &&
                       lastVisiblePosition == (positionStart - 1))) {
           mMessageRecyclerView.scrollToPosition(positionStart);
       }
   }
});

Problem solved!

这篇关于populateViewHolder不能用FirebaseRecyclerAdapter执行(Android)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆