【问题标题】:How to implement Firebase Recycler Adapter in newer version of Android 3.1 and higher?如何在 Android 3.1 及更高版本中实现 Firebase Recycler Adapter?
【发布时间】:2019-07-28 06:06:34
【问题描述】:

基本上,我想做的是使用FirebaseRecyclerAdapter 并用我定制设计的CardView 填充RecyclerView。较新版本的代码已更改,因此,我尝试实现它但没有奏效。 这是我一年前用来编写的代码,它运行良好并填充了我的RecyclerView

FirebaseRecyclerAdapter<DataClass,DataViewHolder> FBRA= new FirebaseRecyclerAdapter<DataClass, DataViewHolder>(
            DataClass,
            R.layout.myCardView,
            DataViewHolder.class,
            databaseReference
    ) {
        @Override
        protected void populateViewHolder(DataViewHolder viewHolder, DataClass model, int position) {
            viewHolder.setTitle(model.gettitle());
            viewHolder.setDate(model.getDate());
        }
   }; 
  myRecyclerView.setAdapter(FBRA);

现在我们必须使用这样的东西, 但问题是这段代码没有填充我的recyclerView(我需要在此处进行哪些更改才能使用我的cardView填充我的recyclerView?)

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

    Query query = FirebaseDatabase.getInstance()
            .getReference()
            .child("Official_Services");

    FirebaseRecyclerOptions<ServiceClass> options = new FirebaseRecyclerOptions.Builder<ServiceClass>()
            .setQuery(query, ServiceClass.class)
            .build();

    FirebaseRecyclerAdapter<ServiceClass, ServiceViewHolder> FBRA = new FirebaseRecyclerAdapter<ServiceClass, ServiceViewHolder>(options) {

        @NonNull
        @Override
        public ServiceViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {

            View view = LayoutInflater.from(HomeActivity.this).inflate(R.layout.service_card, parent, false);

            return new ServiceViewHolder(view);

        }

        @Override
        protected void onBindViewHolder(@NonNull ServiceViewHolder holder, int position, @NonNull ServiceClass model) {

            holder.setServiceName(model.getServiceName());

            holder.setServiceCaption(model.getServiceCaption());

        }

    };

    mServiceList.setAdapter(FBRA);

}

这是我的ViewHolder 课程:

public static class ServiceViewHolder extends RecyclerView.ViewHolder {

    public ServiceViewHolder(View itemView) {

        super(itemView);

        View mView = itemView;

    }

    public void setServiceName(String serviceName) {

        TextView sName = itemView.findViewById(R.id.serviceName);

        sName.setText(serviceName);

    }

    public void setServiceCaption(String serviceCaption) {

        TextView sCaption = itemView.findViewById(R.id.serviceCap);

        sCaption.setText(serviceCaption);
    }

}

这是我的模型类 getter 和 setter:

public class ServiceClass {

private String serviceName;
private String serviceCode;
private String serviceCaption;
private String serviceIconUrl;

public ServiceClass() {
}

public ServiceClass(String serviceName, String serviceCode, String serviceCaption, String serviceIconUrl) {
    this.serviceName = serviceName;
    this.serviceCode = serviceCode;
    this.serviceCaption = serviceCaption;
    this.serviceIconUrl = serviceIconUrl;
}

public String getServiceName() {
    return serviceName;
}

public String getServiceCode() {
    return serviceCode;
}

public String getServiceCaption() {
    return serviceCaption;
}

public String getServiceIconUrl() {
    return serviceIconUrl;
}

public void setServiceName(String serviceName) {
    this.serviceName = serviceName;
}

public void setServiceCode(String serviceCode) {
    this.serviceCode = serviceCode;
}

public void setServiceCaption(String serviceCaption) {
    this.serviceCaption = serviceCaption;
}

public void setServiceIconUrl(String serviceIconUrl) {
    this.serviceIconUrl = serviceIconUrl;
}

@Override
public String toString() {
    return "ServiceClass{" +
            "serviceName='" + serviceName + '\'' +
            ", serviceCode='" + serviceCode + '\'' +
            ", serviceCaption='" + serviceCaption + '\'' +
            ", serviceIconUrl='" + serviceIconUrl + '\'' +
            '}';
}
}

现在我需要做些什么改变?

这是我的整个 java 文件:

public class HomeActivity extends AppCompatActivity {

    private RecyclerView mServiceList;

    private FirebaseDatabase mDatabase;

    private DatabaseReference myRef;

    FirebaseRecyclerAdapter<ServiceClass, ServiceViewHolder> FBRA;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        BottomNavigationViewEx bottomNavigationViewEx = findViewById(R.id.navViewBar);

        bottomNavigationViewEx.enableAnimation(false);

        bottomNavigationViewEx.enableShiftingMode(false);

        bottomNavigationViewEx.setTextVisibility(false);

        Calligrapher calligrapher = new Calligrapher(this);

        calligrapher.setFont(this, "Helvetica.ttf", true);

        mServiceList = findViewById(R.id.serviceRV);

        mServiceList.setHasFixedSize(true);

        mServiceList.setLayoutManager(new LinearLayoutManager(this));

        mDatabase = FirebaseDatabase.getInstance();

        myRef = mDatabase.getReference().child("Official_Services");

    }

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

        FBRA.startListening();

        Query query = myRef;

        FirebaseRecyclerOptions<ServiceClass> options = new FirebaseRecyclerOptions.Builder<ServiceClass>()
                .setQuery(query, ServiceClass.class)
                .build();

        FBRA = new FirebaseRecyclerAdapter<ServiceClass, ServiceViewHolder>(options) {

            @NonNull
            @Override
            public ServiceViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {

                View view = LayoutInflater.from(HomeActivity.this).inflate(R.layout.service_card, parent, false);

                return new ServiceViewHolder(view);

            }

            @Override
            protected void onBindViewHolder(@NonNull ServiceViewHolder holder, int position, @NonNull ServiceClass model) {

                holder.setServiceName(model.getServiceName());

                holder.setServiceCaption(model.getServiceCaption());

            }

        };

        mServiceList.setAdapter(FBRA);



    }



    public static class ServiceViewHolder extends RecyclerView.ViewHolder {

        public ServiceViewHolder(View itemView) {

            super(itemView);

            View mView = itemView;

        }

        public void setServiceName(String serviceName) {

            TextView sName = itemView.findViewById(R.id.serviceName);

            sName.setText(serviceName);

        }

        public void setServiceCaption(String serviceCaption) {

            TextView sCaption = itemView.findViewById(R.id.serviceCap);

            sCaption.setText(serviceCaption);
        }

    }

}

【问题讨论】:

    标签: java android firebase firebase-realtime-database firebaseui


    【解决方案1】:

    为了能够显示来自 Firebase 实时数据库的数据,您需要开始监听更改,为此您应该在 onStart() 方法中添加以下代码行:

    @Override
    protected void onStart() {
        super.onStart();
        FBRA.startListening();
    }
    

    要停止监听更改,您需要在 onStop() 方法中添加以下代码行,如下所示:

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

    请从 post 中查看我的回答,我已经解释了为什么您应该删除监听器。

    附:也请不要忘记将FBRA 设为全局变量,并从对象的声明中删除FirebaseRecyclerAdapter&lt;ServiceClass, ServiceViewHolder&gt;

    【讨论】:

    • 我添加了 FBRA.startListening();在 onStart() 中,但现在应用程序崩溃了。
    • 将此行 FirebaseRecyclerAdapter&lt;ServiceClass, ServiceViewHolder&gt; FBRA = new FirebaseRecyclerAdapter&lt;ServiceClass, ServiceViewHolder&gt;(options) 更改为 FBRA = new FirebaseRecyclerAdapter&lt;ServiceClass, ServiceViewHolder&gt;(options) 现在可以了吗?
    • 在`mServiceList.setAdapter(FBRA);`之后移动这一行FBRA.startListening();,可以吗?
    • 很高兴听到它成功了!这意味着最初的错误消失了,这是个好消息:) serviceNameserviceCaption 没有显示的事实听起来是一个新问题,基本上应该被视为另一个无法在评论中回答的问题。作为个人猜测,我认为您使用了错误的观点,但为了遵守本社区的规则,请使用 MCVE 发布另一个新问题,以便我和其他 Firebase 开发人员可以帮助您。
    • 是的!真的很有帮助?
    【解决方案2】:

    这更像是一个建议。如果您想继续使用旧方法来填充您的 recyclerview 即“populateViewHolder”方法而不是新的“onBindViewHolder”方法就用这个;

    implementation 'com.firebaseui:firebase-ui:1.0.1'
    

    而不是升级的 firebase-ui 版本

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多