Я пытаюсь сделать мой дом похожим на Google Play Home, используя основной RecyclerView в качестве вертикального, и в его элементах я создаю еще один горизонтальный RecyclerView, и он работает нормально, но когда я прокручиваю вниз, горизонтальные элементы RecyclerView исчезают, как на изображениях ниже
здесь дом при первой загрузке (я не знал, почему горизонтальный первый элемент не появляется с самого начала, и мне нужно прокрутить влево, чтобы увидеть его правильно)
здесь другие элементыпри прокрутке вниз (и она сталкивается с той же проблемой с первым элементом)
здесь первый экран после прокрутки вниз и назад при прокрутке вверх горизонтальные элементы исчезают
вот второй экран, если я снова прокручиваю вниз, и странная вещь, там есть вертикальный элемент, работает нормально, и его элементы не исчезают ![here the second screen if i scroll down again](https://i.stack.imgur.com/Ldz4d.png)
Я попробовал некоторые решения
сначала я добавил addOnScrollListener и использовал adpter.notifyDataSetChanged ();при прокрутке, что предотвращает исчезновение предметов, но это не спасло мою последнюю горизонтальную прокрутку при прокрутке вниз, оно всегда возвращает меня к первому предмету.
секунду Я пытаюсь найти решение в этом ответе, и это не помогло Почему элементы RecyclerView исчезают при прокрутке
Вот мой код для первого решения
my_recycler_view.getRecycledViewPool().setMaxRecycledViews(0, 0);
my_recycler_view.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy > 0) {
// Scrolling up
adapter.notifyDataSetChanged();
} else {
adapter.notifyDataSetChanged();
adapter.stopHandler();
}
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == AbsListView.OnScrollListener.SCROLL_STATE_FLING) {
// Do something
} else if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
// Do something
} else {
// Do something
}
}
});
Вот мой первый код адаптера
public class HomeRecyclerViewDataAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private ArrayList<NewHomeItemsModel> dataList;
private Context mContext;
ViewPager viewPager;
HeaderPagerAdapter headerPagerAdapter;
int page = 0;
private Handler handler;
private int delay = 5000; //milliseconds
Runnable runnable = new Runnable() {
public void run() {
if (headerPagerAdapter.getCount() == page) {
page = 0;
} else {
page++;
}
viewPager.setCurrentItem(page, true);
handler.postDelayed(this, delay);
}
};
public HomeRecyclerViewDataAdapter(Context context, ArrayList<NewHomeItemsModel> dataList) {
this.dataList = dataList;
this.mContext = context;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view;
switch (i) {
case Constants.type_header:
view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.home_header_item, null);
HeaderHolder mh = new HeaderHolder(view);
return mh;
case Constants.type_categories:
view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.home_vertical_item, null);
ItemRowHolder mho = new ItemRowHolder(view);
return mho;
case Constants.type_suggestedProducts:
view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.home_vertical_item, null);
ItemRowHolder pro = new ItemRowHolder(view);
return pro;
}
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder itemRowHolder, int i) {
NewHomeItemsModel newHomeItemsModel = dataList.get(i);
Log.d("itemType",String.valueOf(newHomeItemsModel.getType()));
Activity activity = (Activity) mContext;
switch (newHomeItemsModel.getType()) {
case Constants.type_header:
headerPagerAdapter = new HeaderPagerAdapter(activity, newHomeItemsModel.getHeaderImages());
viewPager.setAdapter(headerPagerAdapter);
if (headerPagerAdapter.getCount() == page) {
page = 0;
}
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
page = position;
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
startHandler();
if (Constants.auto_header.equals("start")){
//startHandler();
}else{
//stopHandler();
}
break;
case Constants.type_categories:
final String sectionName = dataList.get(i).getTitle();
ArrayList singleSectionItems = dataList.get(i).getCategories();
((ItemRowHolder) itemRowHolder).itemTitle.setText(sectionName);
final CategoriesRecyAdapter itemListDataAdapter = new CategoriesRecyAdapter(mContext, singleSectionItems);
// ((ItemRowHolder) itemRowHolder).recycler_view_list.setHasFixedSize(true);
final GridLayoutManager manager = new GridLayoutManager(activity, 2 ,
GridLayoutManager.HORIZONTAL, false);
//((ItemRowHolder) itemRowHolder).recycler_view_list.smoothScrollToPosition(0);
((ItemRowHolder) itemRowHolder).recycler_view_list.setLayoutManager(manager);
((ItemRowHolder) itemRowHolder).recycler_view_list.setAdapter(itemListDataAdapter);
((ItemRowHolder) itemRowHolder).recycler_view_list.getRecycledViewPool().setMaxRecycledViews(0, 0);
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return itemListDataAdapter.isHeader(position) ? manager.getSpanCount() : 1;
}
});
// itemListDataAdapter.notifyDataSetChanged();
((ItemRowHolder) itemRowHolder).actionMore.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), sectionName, Toast.LENGTH_SHORT).show();
}
});
break;
case Constants.type_suggestedProducts:
final String sectionNameProduct = dataList.get(i).getTitle();
ArrayList singleSectionItemsProducts = dataList.get(i).getProducts();
((ItemRowHolder) itemRowHolder).itemTitle.setText(sectionNameProduct);
final HomeActivityRecyAdpater productsListDataAdapter = new HomeActivityRecyAdpater( singleSectionItemsProducts
,mContext);
final LinearLayoutManager LManager = new LinearLayoutManager(activity,
LinearLayoutManager.HORIZONTAL, false);
((ItemRowHolder) itemRowHolder).recycler_view_list.setLayoutManager(LManager);
((ItemRowHolder) itemRowHolder).recycler_view_list.setAdapter(productsListDataAdapter);
((ItemRowHolder) itemRowHolder).recycler_view_list.getRecycledViewPool().setMaxRecycledViews(0, 0);
productsListDataAdapter.notifyDataSetChanged();
((ItemRowHolder) itemRowHolder).actionMore.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), sectionNameProduct, Toast.LENGTH_SHORT).show();
}
});
break;
}
}
@Override
public int getItemViewType(int position) {
NewHomeItemsModel newHomeItemsModel = dataList.get(position);
if (newHomeItemsModel != null) {
return newHomeItemsModel.getType();
}
// return super.getItemViewType(position);
return 0;
}
@Override
public int getItemCount() {
return (null != dataList ? dataList.size() : 0);
}
public class ItemRowHolder extends RecyclerView.ViewHolder {
protected TextView itemTitle;
protected RecyclerView recycler_view_list;
protected TextView actionMore;
public ItemRowHolder(View view) {
super(view);
itemTitle = (TextView) view.findViewById(R.id.best_offers_title);
recycler_view_list = (RecyclerView) view.findViewById(R.id.offers_rv);
actionMore = (TextView) view.findViewById(R.id.best_offers_more_action);
}
}
public class HeaderHolder extends RecyclerView.ViewHolder {
protected ImageView headerImg;
public HeaderHolder(View view) {
super(view);
viewPager = view.findViewById(R.id.Header_view_pager_item);
// this.headerImg = (ImageView) view.findViewById(R.id.header_pager_image);
}
}
public class ProductsHolder extends RecyclerView.ViewHolder {
protected TextView itemTitleProduct;
protected RecyclerView recycler_view_list;
protected TextView actionMore;
public ProductsHolder(View view) {
super(view);
this.itemTitleProduct = (TextView) view.findViewById(R.id.best_offers_title);
this.recycler_view_list = (RecyclerView) view.findViewById(R.id.offers_rv);
this.actionMore = (TextView) view.findViewById(R.id.best_offers_more_action);
}
}
public void stopHandler(){
if (handler!=null){
handler.removeCallbacks(runnable);
handler=null;
}
}
public void startHandler(){
if (handler==null){
handler = new Handler();
handler.postDelayed(runnable, delay);
}
}
}
, поэтому надеюсь, что кто-нибудь может помочь в решении этой проблемы ипроблема первой загрузки горизонтального списка, который не отображает весь первый элемент