У меня Viewpager с двумя вкладками внутри. Вкладки - Карты и Избранные карты. Я использую один и тот же фрагмент внутри обеих вкладок. Фрагмент содержит RecyclerView, который я обновляю динамически. Я добавляю элементы на обе вкладки по очереди. Сначала я полностью добавляю элементы на первую вкладку (вкладка «Карты»), а после этого добавляю элементы во вторую вкладку (вкладка «Любимая карта»). Моя проблема в том, что когда я добавляю элементы во вторую вкладку, мой RecyclerView внутри первой вкладки также обновляется. Теперь элементы на первой вкладке RecyclerView представляют собой сумму существующих элементов плюс элементы, которые я добавляю во второй вкладке. Я установил два разных ArrayList на вкладке ViewPager. Но когда getItemCount() вызывается на первой вкладке RecyclerView, в ArrayList есть элемент, который я добавил во вторую вкладку.
Я использую один и тот же фрагмент с RecyclerView на обеих вкладках. Когда я хочу обновить одну вкладку, я вызываю notifyDatasetChanged() на ViewPager. Таким образом, каждый раз, когда RecyclerView внутри фрагмента повторно инициализируется.
Это мой адаптер Viewpager
public class ViewPagerWebCardsAdapter extends FragmentStatePagerAdapter {
private ArrayList<WebCardBaseResponseModel> webCardDetailList;
private ArrayList<WebCardBaseResponseModel> followingWebCardList;
private Context context;
private boolean isEmptyFavoriteWebcardList;
private boolean isEmptyWebcardsList;
public ViewPagerWebCardsAdapter(FragmentManager fm, ArrayList<WebCardBaseResponseModel> webCardDetailList,
ArrayList<WebCardBaseResponseModel> followingWebCardList,
Context context) {
super(fm);
this.webCardDetailList = webCardDetailList;
this.followingWebCardList = followingWebCardList;
this.context = context;
}
public void updateWebCardLists( ArrayList<WebCardBaseResponseModel> webCardDetailList,
ArrayList<WebCardBaseResponseModel> followingWebCardList) {
this.webCardDetailList = webCardDetailList;
this.followingWebCardList = followingWebCardList;
notifyDataSetChanged();
}
public void setEmptyFollowingCardsFragment() {
isEmptyFavoriteWebcardList = true;
notifyDataSetChanged();
}
public void setEmptyWebCardsFragment() {
isEmptyWebcardsList = true;
notifyDataSetChanged();
}
@Override
public Fragment getItem(int position) {
if (position == 0) {
WebCardListFragment webCardListFragment = new WebCardListFragment();
webCardListFragment.setWebCardDetailList(webCardDetailList);
webCardListFragment.setEmptyListFragment(isEmptyWebcardsList);
return webCardListFragment;
} else {
WebCardListFragment webCardListFragment = new WebCardListFragment();
webCardListFragment.setWebCardDetailList(followingWebCardList);
webCardListFragment.setEmptyListFragment(isEmptyFavoriteWebcardList);
webCardListFragment.setAsFavoritesList();
return webCardListFragment;
}
}
@Override
public int getCount() {
return Constants.NUMBER_TWO;
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@Override
public CharSequence getPageTitle(int position) {
if (position == 0) {
return context.getString(R.string.webcards);
} else {
return context.getString(R.string.favorite);
}
}
}
Это фрагмент моей карты
public class WebCardListFragment extends Fragment {
@BindView(R.id.web_card_recycler_view)
RecyclerView mWebCardDetailRecyclerView;
@BindView(R.id.tv_description)
TextView tvDescription;
@BindView(R.id.progress_bar)
public ProgressBar progressBar;
private WebCardListAdapter mWebCardListAdapter;
ArrayList<WebCardBaseResponseModel> mWebCardDetailList;
WebCardActivity activity;
private boolean isFavorites;
private boolean isEmptyListFragment;
@Override
public void onAttach(Context context) {
super.onAttach(context);
activity = (WebCardActivity) context;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public void setWebCardDetailList(ArrayList<WebCardBaseResponseModel> mWebCardDetailList) {
this.mWebCardDetailList = mWebCardDetailList;
}
public void setAsFavoritesList() {
this.isFavorites = true;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_webcard_list, container, false);
ButterKnife.bind(this, view);
initView();
return view;
}
private void initView() {
if (isFavorites) {
tvDescription.setText(getString(R.string.select_webcard_to_share));
}
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(activity);
mWebCardDetailRecyclerView.setLayoutManager(mLayoutManager);
mWebCardDetailRecyclerView.setHasFixedSize(true);
mWebCardDetailRecyclerView.setItemAnimator(new DefaultItemAnimator());
if (mWebCardDetailList != null && mWebCardDetailList.size() > 0) {
progressBar.setVisibility(View.GONE);
tvDescription.setVisibility(View.VISIBLE);
mWebCardListAdapter = new WebCardListAdapter(activity, mWebCardDetailList, isFavorites);
}
if (isEmptyListFragment) {
progressBar.setVisibility(View.GONE);
tvDescription.setVisibility(View.VISIBLE);
tvDescription.setText(getString(R.string.no_webcards_to_list));
}
mWebCardDetailRecyclerView.setAdapter(mWebCardListAdapter);
}
public void setEmptyListFragment(boolean isEmptyList) {
isEmptyListFragment = isEmptyList;
}
}
Наконец, это мой адаптер RecyclerView, который я использую внутри фрагмента.
public class WebCardListAdapter extends RecyclerView.Adapter<WebCardListAdapter.ViewHolder> {
private Context mContext;
private ArrayList<WebCardBaseResponseModel> mWebCardDetailList;
private boolean isFavorites;
public WebCardListAdapter(Context context, ArrayList<WebCardBaseResponseModel> webCardDetailList, boolean isFavorites) {
mContext = context;
mWebCardDetailList = webCardDetailList;
this.isFavorites = isFavorites;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_webcard_detail_layout, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
setListItemView(holder, position);
setListItemClickListener(holder);
}
@Override
public int getItemCount() {
return mWebCardDetailList.size();
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
class ViewHolder extends RecyclerView.ViewHolder {
private TextView mCardNameTextView;
private LinearLayout mWeCardLinearLayout;
@BindView(R.id.tv_phone)
TextView phone;
ViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
mCardNameTextView = (TextView) itemView.findViewById(R.id.webcard_name_textview);
mWeCardLinearLayout = (LinearLayout) itemView.findViewById(R.id.wed_card_title_linear_layout);
}
}
}
Я хочу, чтобы ListView внутри обеих вкладок был независимым. Когда я добавляю элементы во вторую вкладку RecyclerView, это не должно отражаться на первой вкладке RecyclerView.
Основное отличие
FragmentPagerAdapter
Подходит для ограниченного (фиксированного) количества предметов (фрагментов). Почему? Потому что он никогда не удаляет экземпляр фрагмента из FragmentManager после его создания (если это действие не завершено). Он только отделяет просмотры от фрагментов, которые в настоящее время не видны. onDestroyView () будет вызываться для вашего фрагмента, когда он окажется вне досягаемости, а позже будет вызываться onCreateView (), когда вы вернетесь к этому фрагменту.
FragmentStatePagerAdapter
FragmentStatePagerAdapter больше ориентирован на память. Он полностью удаляет экземпляры фрагментов из FragmentManager, когда они становятся недоступными. Состояние удаленных фрагментов сохраняется внутри FragmentStatePagerAdapter. Экземпляр Fragment воссоздается после того, как вы вернетесь к существующему элементу и состояние будет восстановлено. Этот адаптер подходит для списков с неизвестным количеством или для списков, в которых элементы сильно меняются.
Итак, FragmentPagerAdapter решит эту проблему
Я вызываю notifyDatasetChanged () на пейджере просмотра. Таким образом, каждый раз, когда вид ресайклера внутри фрагмента повторно инициализируется.
Удалите функцию переопределения "getItemPosition" из класса адаптера vew-пейджера. Надеюсь, это поможет.
Спасибо за ответы, в любом случае эта проблема не имеет ничего общего с Recyclerview или Viewpager, это произошло из-за моего непонимания ссылки на переменную. Я меняю ArrayList в другом месте внутри деятельности. Это влияет на список в recyclerview.
Где и как вы добавляете элементы в
RecyclerView?