Элементы RecyclerView удаляются при прокрутке и не фокусируются на первом элементе целиком - PullRequest
1 голос
/ 10 апреля 2019

Я пытаюсь сделать мой дом похожим на Google Play Home, используя основной RecyclerView в качестве вертикального, и в его элементах я создаю еще один горизонтальный RecyclerView, и он работает нормально, но когда я прокручиваю вниз, горизонтальные элементы RecyclerView исчезают, как на изображениях ниже

здесь дом при первой загрузке (я не знал, почему горизонтальный первый элемент не появляется с самого начала, и мне нужно прокрутить влево, чтобы увидеть его правильно) here the home on first loading здесь другие элементыпри прокрутке вниз (и она сталкивается с той же проблемой с первым элементом) here the other items on scrolling down здесь первый экран после прокрутки вниз и назад при прокрутке вверх горизонтальные элементы исчезают here the first screen after i scroll down and back with scroll up вот второй экран, если я снова прокручиваю вниз, и странная вещь, там есть вертикальный элемент, работает нормально, и его элементы не исчезают here the second screen if i scroll down again

Я попробовал некоторые решения

  • сначала я добавил 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);
    }
}

}

, поэтому надеюсь, что кто-нибудь может помочь в решении этой проблемы ипроблема первой загрузки горизонтального списка, который не отображает весь первый элемент

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...