为什么我的领域回收视图没有显示任何数据?

时间:2017-10-14 06:26:00

标签: android realm realm-mobile-platform

我已经实现了RecyclerView显示一些领域表数据。我通过从RealmRecyclerViewAdapter扩展来创建适配器。甚至以为我在表中有3行(我通过结果调试检查)没有显示在列表中。我使用'io.realm:android-adapters:2.1.0'适配器和Realm 3.7.2

这是我的代码。

适配器类。

 public class UserListAdapter extends RealmRecyclerViewAdapter<User,UserListAdapter.ViewHolder> {

    public UserListAdapter(@Nullable OrderedRealmCollection<User> data, boolean autoUpdate) {
        super(data, autoUpdate);
        setHasStableIds(true);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.user_list_layout, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        User user = getItem(position);
        holder.home.setText(user.getUid());
        holder.name.setText(user.getName());
        holder.home.setText(user.getHouse().getName());
        if(user.isStatus()) {
            holder.status.setText("Active");
        }else{
            holder.status.setText("Inactive");
        }
    }

    @Override
    public long getItemId(int index) {
        return getItem(index).getUid();
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        @BindView(R.id.column_id)
        TextView id;

        @BindView(R.id.column_name)
        TextView name;

        @BindView(R.id.column_house)
        TextView home;

        @BindView(R.id.status_button)
        Button status;

        public ViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
            itemView.setOnClickListener(this);
            status.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if(v.getId() ==  R.id.status){
                //TODO: create interface and add method tho trigger when status click
            }else{
                //TODO: create interface and add method tho trigger when item click
            }

        }
    }
}

用于设置适配器的代码片段

try(Realm realm = Realm.getDefaultInstance()){
            RealmResults<User> users = realm.where(User.class).findAll();
            listAdapter = new UserListAdapter(users,true);
            recyclerView.setAdapter(listAdapter);
            recyclerView.addItemDecoration(new RecyclerViewDividerVertical(2));
            recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
}

我可以将RealmResults<User>转换为ArrayList<User>并实现正常的RecyclerView适配器并完成它。但是,我理解RealmRecyclerViewAdapter会在数据发生变化时导致自动更新结果数据。但我也不是100%明确的。任何人都可以解释它是如何工作的吗感谢。

2 个答案:

答案 0 :(得分:1)

您的数据看起来无效,RealmRecyclerViewAdapter中实现的 getItemCount()方法返回0.

答案 1 :(得分:1)

try(Realm realm = Realm.getDefaultInstance()){
        RealmResults<User> users = realm.where(User.class).findAll();
        listAdapter = new UserListAdapter(users,true);
        recyclerView.setAdapter(listAdapter);
        recyclerView.addItemDecoration(new RecyclerViewDividerVertical(2));
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
} // <--- auto-close!

如果您关闭Realm实例,则绑定到它的结果将失效,并RealmRecyclerViewAdapter检查isValid()将返回false,因为您已关闭了Realm,因此它将会使用0元素计数显示。

请参阅UI线程Realm实例的正确生命周期管理(onCreate() open,onDestroy() close)in the documentation