ViewPager
有3页(FragmentPagerAdapter
)
第1页RealmRecyclerView
。
当Realm
为空时,“无项目”消息和“添加”按钮代表。没关系。
所以,我已将我的第一个对象添加到Realm
。
尽管我期望看到RealmRecyclerView
(RRV),但是EmptyView仍然在这里。
当我在tab1
和tab2
之间切换时,没有任何变化。
但是如果我转到tab3
然后回到我的tab1
- RRV
,最终会出现。
它不依赖于页面的内容。
RRV
的外观仅受tab3
返回的影响。
我不明白原因。
我重新检查了我的TabViewPager
,TabAdapter
和Fragments
。
一切正常。
没有什么是多余的,在我看来这可能会影响到这一点。
第二个问题:
当我通过RRV
小部件的查询过滤我的SearchView
时,会出现带有延迟的EmptyView。
例如:如果有“12345”项,则只有当查询为“1234567”而不是“123456”时,才会显示EmptyView ..
第一个不匹配RRV
仍然可见,尽管它是空的。
并且只有当两个或更多字符RRV
的差异消失时才会出现。
删除多余的字符也无法给出正确的表示。
我认为这两种情况都有一个原因。 你能指出错误吗?
FirstFragment.java
public class FirstFragment extends Fragment {
Realm realm;
RecyclerView realmRecyclerView;
FirstAdapter adapter;
TextView emptyText;
Button buttonAdd;
public FirstFragment () {
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View fragmentView = inflater.inflate(R.layout.fragment_first, container, false);
realm = Realm.getDefaultInstance();
realmRecyclerView = fragmentView.findViewById(R.id.recyclerView_first);
RealmResults<Object> results = realm.where(Object.class).findAll();
emptyText = fragmentView.findViewById(R.id.tv_no_data);
buttonAdd = fragmentView.findViewById(R.id.button_add);
setUpRealmRecyclerView();
initButtonAdd();
if (!results.isEmpty()) {
realmRecyclerView.setVisibility(View.VISIBLE);
emptyText.setVisibility(View.GONE);
buttonAdd.setVisibility(View.GONE);
} else {
realmRecyclerView.setVisibility(View.GONE);
emptyText.setVisibility(View.VISIBLE);
buttonAdd.setVisibility(View.VISIBLE);
}
return fragmentView;
}
private void setUpRealmRecyclerView() {
adapter = new FirstAdapter(realm, realm.where(Object.class).findAll());
realmRecyclerView.setHasFixedSize(true);
realmRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
realmRecyclerView.setAdapter(adapter);
FirstTouchHelper callback = new FirstTouchHelper(realm);
ItemTouchHelper touchHelper = new ItemTouchHelper(callback);
touchHelper.attachToRecyclerView(realmRecyclerView);
}
@Override
public void onDestroyView() {
super.onDestroyView();
realmRecyclerView.setAdapter(null);
realm.close();
}
private void initButtonAdd() {
//create new object dialog
}
@Override
public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
inflater.inflate(R.menu.actionbar_menu, menu);
SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
final SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
SearchableInfo searchableInfo = searchManager.getSearchableInfo(getActivity().getComponentName());
searchView.setSearchableInfo(searchableInfo);
searchView.setIconifiedByDefault(true);
EditText editTextSearch = (EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
editTextSearch.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable editable) {
adapter.getFilter().filter(editable);
if (adapter.getItemCount()==0) {
realmRecyclerView.setVisibility(View.GONE);
buttonAdd.setVisibility(View.VISIBLE);
} else {
realmRecyclerView.setVisibility(View.VISIBLE);
buttonAdd.setVisibility(View.GONE);
}
}
});
super.onCreateOptionsMenu(menu, inflater);
}
}
RRV适配器:
public class FirstAdapter
extends RealmRecyclerViewAdapter<Object, RecyclerView.ViewHolder>
implements Filterable{
Realm realm;
public FirstAdapter(Realm realm, OrderedRealmCollection<Object> data) {
super(data, true, true);
this.realm = realm;
setHasStableIds(true);
}
@Override
public long getItemId(int index) {
return getItem(index).getId();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.rrv_item, parent, false);
ObjectClass holder = new ObjectClass(v);
return holder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
Object object = getData().get(position);
ObjectClass classHolder = (ObjectClass) holder;
classHolder.name.setText(object.getName());
}
public void filterResults(String text) {
text = text == null ? null : text.toLowerCase().trim();
RealmQuery<Object> query = realm.where(Object.class);
if (text == null || "".equals(text)) {
updateData(query
.findAll()
.sort("name"));
} else {
updateData(query
.contains("name", text, Case.INSENSITIVE)
.findAll()
.sort("name"));
}
}
public Filter getFilter() {
ObjectFilter filter = new ObjectFilter(this);
return filter;
}
private class ObjectFilter
extends Filter {
private final FirstAdapter adapter;
private ObjectFilter(FirstAdapter adapter) {
super();
this.adapter = adapter;
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
return new FilterResults();
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
adapter.filterResults(constraint.toString());
}
}
private class ObjectClass
extends RecyclerView.ViewHolder {
TextView name;
private ObjectClass(View itemView) {
super(itemView);
name = itemView.findViewById(R.id.name_text_view);
}
}
}
答案 0 :(得分:0)
单击第3个选项卡然后单击第1个选项卡&#34;重新加载&#34;并且正确显示您的观点是因为offscreenPageLimit
默认为1
,因此选择tab 1
时,tab 3
会被销毁,选择tab 3
时, tab 1
被摧毁。
因此,您的视图会重新创建,因此它会正确显示。
但是要解决您的问题,您应该使用RealmChangeListener在写入Realm时接收通知。
public class FirstFragment extends Fragment {
Realm realm;
RealmResults<Object> results;
RealmChangeListener<RealmResults<Object>> changeListener = new RealmChangeListener<RealmResults<Object>>() {
@Override
public void onChange(RealmResults<Object> results) {
if (!results.isEmpty()) {
realmRecyclerView.setVisibility(View.VISIBLE);
emptyText.setVisibility(View.GONE);
buttonAdd.setVisibility(View.GONE);
} else {
realmRecyclerView.setVisibility(View.GONE);
emptyText.setVisibility(View.VISIBLE);
buttonAdd.setVisibility(View.VISIBLE);
}
}
};
RecyclerView realmRecyclerView;
PickProductAdapter adapter;
TextView emptyText;
Button buttonAdd;
public FirstFragment () {
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View fragmentView = inflater.inflate(R.layout.fragment_first, container, false);
realm = Realm.getDefaultInstance();
realmRecyclerView = fragmentView.findViewById(R.id.recyclerView_first);
results = realm.where(Object.class).findAllAsync();
results.addChangeListener(changeListener);
emptyText = fragmentView.findViewById(R.id.tv_no_data);
buttonAdd = fragmentView.findViewById(R.id.button_add);
setUpRealmRecyclerView();
initButtonAdd();
return fragmentView;
}
private void setUpRealmRecyclerView() {
adapter = new PickProductAdapter(realm, results);
realmRecyclerView.setHasFixedSize(true);
realmRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
realmRecyclerView.setAdapter(adapter);
FirstTouchHelper callback = new FirstTouchHelper(realm);
ItemTouchHelper touchHelper = new ItemTouchHelper(callback);
touchHelper.attachToRecyclerView(realmRecyclerView);
}
@Override
public void onDestroyView() {
super.onDestroyView();
results.removeAllChangeListeners();
realmRecyclerView.setAdapter(null);
realm.close();
}
private void initButtonAdd() {
//create new object dialog
}
@Override
public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
inflater.inflate(R.menu.first_actionbar_menu, menu);
// set searchview
}
}
编辑:你的空视图没有更新的原因是因为它独立于适配器中的内容,所以你需要添加一些你可以在过滤时调用的回调方法很活跃。
public class FirstFragment extends Fragment {
...
public void updateData(RealmResults<Object> results) {
if(this.results != null && this.results.isValid()) {
this.results.removeAllChangeListeners();
}
this.results = results;
results.addChangeListener(changeListener);
}
和
public class FirstAdapter
extends RealmRecyclerViewAdapter<Object, RecyclerView.ViewHolder>
implements Filterable{
FirstFragment firstFragment; // could be interface or somethin'
Realm realm;
public FirstAdapter(FirstFragment firstFragment, Realm realm, OrderedRealmCollection<Object> data) {
...
...
@Override
public void updateData(OrderedRealmCollection<Object> collection) {
super.updateData(collection);
firstFragment.updateData((RealmResults<Object>)collection);
}
编辑:
另外
RealmQuery<Object> query = realm.where(Object.class);
if (text == null || "".equals(text)) {
updateData(query
.sort("name")
.findAllAsync());
} else {
updateData(query
.contains("name", text, Case.INSENSITIVE)
.sort("name")
.findAllAsync());
}
和
editTextSearch.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable editable) {
adapter.getFilter().filter(editable);
// this should be in `onChange()`
/*if (adapter.getItemCount()==0) {
realmRecyclerView.setVisibility(View.GONE);
buttonAdd.setVisibility(View.VISIBLE);
} else {
realmRecyclerView.setVisibility(View.VISIBLE);
buttonAdd.setVisibility(View.GONE);
}*/
}
});