FirebaseRecyclerAdapter不适用于数据绑定

时间:2016-10-19 02:11:05

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

我正在使用 RecyclerView 数据绑定,但是当我第一次运行应用时,没有任何内容显示,然后更新一些内容或通过更新应用即时运行会显示内容。

我的ViewHolder:

class MyViewHolder extends RecyclerView.ViewHolder {
    private ItemBinding mBinding;

    public MyViewHolder(View itemView) {
        super(itemView);
        mBinding = DataBindingUtil.bind(itemView);
    }

    ItemBinding getBinding() {
        return mBinding;
    }
}

我的适配器:

public class MyAdapter extends FirebaseRecyclerAdapter<MyModel, MyViewHolder> {
    public MyAdapter(Query ref) {
        super(MyModel.class, R.layout.my_item, MyViewHolder.class, ref);
    }

    @Override
    protected void populateViewHolder(MyViewHolder viewHolder, MyModel model, int position) {
        ItemBinding binding = viewHolder.getBinding();
        binding.setMyModel(model);
        binding.executePendingBindings();
    }
}

我在其他一些问题中发现我需要致电binding.executePendingBindings(),这是我没有成功的。

修改

我刚刚添加了一个日志调用:

Log.d(BuildConfig.TAG, "called populateViewHolder " + position);

populateViewHolder方法上。永远不会打印日志。

修改2

我如何初始化我的recyclerView:

// onCreate
LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);

mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view)
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(llm);
mRef = FirebaseDatabase.getInstance().getReference().child(CHILD_TREE)    

// onStart    
mAdapter = new MyAdapter(mref.orderByChild("date"));
mRecyclerView.setAdapter(mAdapter);

3 个答案:

答案 0 :(得分:1)

来自我的评论:

  

您是否已查看firebase/FirebaseUI-Android问题..?将RecyclerView heightwrap_content设置为match_parent解决了那里的问题。

显然,使用height wrap_content时,RecyclerView中的FirebaseRecyclerAdapter设置为DataBinding确实存在问题。

将其更改为

android:layout_height="match_parent"

它应该有效。

FirebaseUI-Android团队认为这是RecyclerView本身存在的问题,并已解决此问题。 This是Github问题的交叉点。

答案 1 :(得分:-1)

将数据存储在模型的ArrayList中。然后尝试在适配器中实现onBindViewHolder方法。 onBindViewHolder有两个属性 - 持有者和位置。持有者将是MyViewHolder类的一个对象,您可以使用该位置从数组列表中获取模型的对象。

答案 2 :(得分:-1)

已修改

  

您正在调用给定的陈述

mAdapter = new MyAdapter(mref.orderByChild("date"));
mRecyclerView.setAdapter(mAdapter);
onStart中的

。在onCreate之后 onStart调用。在初始化之前已经将适配器设置为recyclerView,并且尚未创建数据库的引用。在onCreate之后将上述两个语句放在

之后
LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);

mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view)
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(llm);
mRef = FirebaseDatabase.getInstance().getReference().child(CHILD_TREE) ;
// adapter must be set after getting mRef
mAdapter = new MyAdapter(mref.orderByChild("date"));
mRecyclerView.setAdapter(mAdapter);