我已经实现了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%明确的。任何人都可以解释它是如何工作的吗感谢。
答案 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。