Tab+ViewPager 不更新而是显示奇怪的警告预期状态 3 found 2 [英] Tab+ViewPager not updating instead shows weird warning expected state 3 found 2
问题描述
我有一个主要活动,其中包括一个带有 ViewPager 的 TabLayout
我添加了 3 个标签,每个标签都有单独的片段,其中包含一个 recyclerview,这些 recyclerviews 有一个复选框,每当我滑动 viewpager 时都应该同时更新/刷新(我将选中的位置保存在共享首选项和更新中通过共享首选项).
我的问题是每当我选中 tab1 中的复选框时,tab2 不会更新/刷新,直到我向下滚动 Recyclerview.并且 tab3 工作正常.而且我在 logcat 中也收到了一个奇怪的警告.
03-05 09:35:53.345 4317-4327/com.example.rubin W/art: Suspending all threads took: 6.805ms
03-05 09:35:58.310 4317-4317/com.example.rubin W/FragmentManager: moveToState: Fragment state for Tab3{10a5f1f0 #2 id=0x7f0d00b6} not updated inline; expected state 3 found 2
03-05 09:36:01.363 4317-4317/com.example.rubin W/FragmentManager: moveToState: Fragment state for Tab1{2d9aa887 #1 id=0x7f0d00b6} not updated inline; expected state 3 found 2
我的 PagerAdapter
My PagerAdapter
public class PagerAdapter1 extends FragmentStatePagerAdapter {
int mNumOfTabs;
public PagerAdapter1(FragmentManager fm, int NumOfTabs) {
super(fm);
this.mNumOfTabs = NumOfTabs;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new Tab1();
case 1:
return new Tab2();
case 2:
return new Tab3();
default:
return null;
}
}
@Override
public int getCount() {
return mNumOfTabs;
}
}
Tablayout OnPageChangelistener
Tablayout OnPageChangelistener
final PagerAdapter1 adapter = new PagerAdapter1
(getSupportFragmentManager(), tabLayout1.getTabCount(), getApplicationContext());
viewPager1.setAdapter(adapter);
viewPager1.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout1));
tabLayout1.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager1.setCurrentItem(tab.getPosition());
adapter.notifyDataSetChanged();
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
每个片段的代码.
public class Tab1 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.home_tab1_recycler, container, false);
RecyclerView rv = (RecyclerView) v.findViewById(R.id.home_recyclerview);
LinearLayoutManager llm = new LinearLayoutManager(getContext());
rv.setLayoutManager(llm);
rv.setHasFixedSize(true); // to improve performance
rv.setAdapter(new HomeManager()); // the projectdatabase manager is assigner to the RV
return v;
}
public class HomeManager extends RecyclerView.Adapter<HomeManager.RecyclerViewHolder> {
int Length,h;
View v1;
ArrayList<String> PROJECT_ID = new ArrayList<String>();
Set<String> set;
List<String> selected;
public class RecyclerViewHolder extends RecyclerView.ViewHolder {
CheckBox mCheck;
RecyclerViewHolder(final View itemView) {
super(itemView);
mCheck = (CheckBox) itemView.findViewById(R.id.PROJECT_fav);
SharedPreferences pref = getContext().getSharedPreferences("MirSP", Context.MODE_PRIVATE);
set = pref.getStringSet("FAV", null);
if (set != null) {
selected = new ArrayList<String>(set);
} else {
selected = new ArrayList<String>();
}
mCheck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
h = getAdapterPosition();
check = PROJECT_ID.get(h); // for saving the project id from json.
if (selected.contains(check)) {
selected.remove(check);
mCheck.setBackgroundResource(R.drawable.ic_favorite_white1_24dp);
Snackbar snackbar = Snackbar.make(v, "Property Unfavorited", Snackbar.LENGTH_SHORT);
snackbar.show();
} else {
selected.add(check);
mCheck.setBackgroundResource(R.drawable.ic_favorite_white_24dp);
Snackbar snackbar = Snackbar.make(v, "Property Favorited", Snackbar.LENGTH_SHORT);
snackbar.show();
}
Log.e("HF update checked", String.valueOf(selected));
Set<String> set = new HashSet<String>();
set.addAll(selected);
SharedPreferences pref = getContext().getSharedPreferences("MirSP", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit();
editor.putStringSet("FAV", set);
editor.commit();
}
}
});
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
v1 = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recyclerview_item, viewGroup, false);
return new RecyclerViewHolder(v1);
}
@Override
public void onBindViewHolder(final RecyclerViewHolder viewHolder, int i) {
SharedPreferences pref = getContext().getSharedPreferences("MirSP", Context.MODE_PRIVATE);
set = pref.getStringSet("FAV", null);
if (set != null) {
selected = new ArrayList<String>(set);
} else {
selected = new ArrayList<String>();
}
Log.e("HF update UI", String.valueOf(selected));
if (String.valueOf(selected).contains(String.valueOf(PROJECT_ID.get(i)))) {
viewHolder.mCheck.setBackgroundResource(R.drawable.ic_favorite_white_24dp);
} else {
viewHolder.mCheck.setBackgroundResource(R.drawable.ic_favorite_white1_24dp);
}
}
@Override
public int getItemCount() {
//Code for Total length of json
return Length;
}
推荐答案
FragmentPagerAdapter
在改变状态的活动片段的邻域上调用 setUserVisibleHint(true|false)
这个片段.这至少是奇怪的警告消息"的答案,但它可能无法解决您的问题.
The FragmentPagerAdapter
calls setUserVisibleHint(true|false)
on neighbourhoods of the active fragment which changes the state of this fragments.
This is at least the answer of the "weird warning messages" but it may not solve your problem.
关于您对如何解决该警告消息的评论,我创建了自己的 FragmentPagerAdapter,如下所示:
Regarding your comment about how to solve that warning message I have created my own FragmentPagerAdapter as follows:
public abstract class AbstractTabPagerAdapter extends PagerAdapter {
private static final String TAG = AbstractTabPagerAdapter.class.getCanonicalName();
private final FragmentManager mFragmentManager;
private FragmentTransaction mCurTransaction;
private Fragment mCurrentPrimaryItem = null;
public AbstractTabPagerAdapter(FragmentManager fragmentManager) {
mFragmentManager = fragmentManager;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
if (mCurTransaction == null) {
throw new IllegalArgumentException("current transaction must not be null");
}
String fragmentTag = makeFragmentName(container.getId(), position);
Fragment fragment = (Fragment) mFragmentManager.findFragmentByTag(fragmentTag);
if (fragment != null) {
mCurTransaction.attach(fragment);
Log.d(TAG, "Attaching existing fragment " + fragment + " at position " + position);
//mCurTransaction.add(container.getId(), fragment, makeFragmentName(container.getId(), position));
} else {
fragment = getItem(position);
mCurTransaction.add(container.getId(), fragment, fragmentTag);
Log.d(TAG, "Attaching new fragment " + fragment + " at position " + position);
}
if (fragment != mCurrentPrimaryItem) {
fragment.setMenuVisibility(false);
//fragment.setUserVisibleHint(false);
}
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
if (mCurTransaction == null) {
throw new IllegalArgumentException("current transaction must not be null");
}
mCurTransaction.detach((Fragment) object);
//mCurTransaction.remove((Fragment)object);
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
//super.setPrimaryItem(container, position, object);
Fragment fragment = (Fragment) object;
if (fragment != mCurrentPrimaryItem) {
Log.d(TAG, "set Primary item " + position + " to " + fragment);
if (mCurrentPrimaryItem != null) {
mCurrentPrimaryItem.setMenuVisibility(false);
// this command unexpectedly changes the state of the fragment which leads to a warning message and possible some strange behaviour
//mCurrentPrimaryItem.setUserVisibleHint(false);
}
if (fragment != null) {
fragment.setMenuVisibility(true);
//fragment.setUserVisibleHint(true);
}
mCurrentPrimaryItem = fragment;
}
}
@Override
public boolean isViewFromObject(View view, Object fragment) {
return ((Fragment) fragment).getView() == view;
}
public abstract Fragment getItem(int position);
@Override
public void startUpdate(ViewGroup container) {
super.startUpdate(container);
if (mCurTransaction != null) {
throw new IllegalArgumentException("current transaction must not be null");
}
mCurTransaction = mFragmentManager.beginTransaction();
Log.d(TAG, "FragmentTransaction started");
}
@Override
public void finishUpdate(ViewGroup container) {
if (mCurTransaction != null) {
mCurTransaction.commit();
mCurTransaction = null;
//mFragmentManager.executePendingTransactions();
Log.d(TAG, "FragmentTransaction committed");
} else {
throw new IllegalArgumentException("current transaction must not be null");
}
}
private String makeFragmentName(int viewId, int position) {
if (viewId <= 0)
throw new IllegalArgumentException("viewId " + viewId);
return "tabpageradptr:" + getPageTitle(position) + ":" + viewId + ":" + position;
}
}
警告信息现在消失了,目前我没有遇到任何缺陷 - 但我仍在研究中.
The warning message is gone now and currently I do not experience any flaws - but I am still in the middle of research.
这篇关于Tab+ViewPager 不更新而是显示奇怪的警告预期状态 3 found 2的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!