当前位置: 首页 > 知识库问答 >
问题:

在具有中心选择水平滚动视图的RecyclerView上Notifydatasetchange不工作?

洪昱
2023-03-14

自动滚动是个问题

我使两个回收视图相互依赖的水平滚动和中心选择。

因此,我的问题是使用Notifydatasetchanged方法,并将recyclerView位置重置为0,它滚动选择范围,因为它返回了错误的索引。。。

当我想在更改数据后获取中心选择索引时。我使用下面的示例通过一些编辑来实现这一点。

滚动时获取RecycleView的中心可见项

我需要将第一个recyclerView适配器上的滚动数据更改为第二个recyclerView适配器上的数据。

但是scrollview设置了第一个位置的位置我尝试了通知fyItemRangeChanged(int, int)通知fyItemRangeInserted(int, int)方法...

详细说明:我正在更改类型并重置look scrollview的值。我需要改变底部滚动视图的选定位置。特别是我不能通过改变数据来获得中心位置。意味着我如果我通知适配器比索引将保持原样。重置数据后,我需要像正常适配器一样工作。

提前谢谢。

   public void getRecyclerview_Type() {

    final RecyclerView recyclerView_Type = (RecyclerView) findViewById(R.id.recycleView);
    if (recyclerView_Type != null) {
        recyclerView_Type.postDelayed(new Runnable() {
            @Override
            public void run() {
                setTypeValue();
            }
        }, 300);
        recyclerView_Type.postDelayed(new Runnable() {
            @Override
            public void run() {
                // recyclerView_Type.smoothScrollToPosition(Type_Adapter.getItemCount() - 1);
                setTypeValue();
            }
        }, 5000);
    }
    ViewTreeObserver treeObserver = recyclerView_Type.getViewTreeObserver();
    treeObserver.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {

        @Override
        public boolean onPreDraw() {
            recyclerView_Type.getViewTreeObserver().removeOnPreDrawListener(this);
            finalWidthDate = recyclerView_Type.getMeasuredWidth();
            itemWidthDate = getResources().getDimension(R.dimen.item_dob_width_padding);
            paddingDate = (finalWidthDate - itemWidthDate) / 2;
            firstItemWidthDate = paddingDate;
            allPixelsDate = 0;

            final LinearLayoutManager dateLayoutManager = new LinearLayoutManager(getApplicationContext());
            dateLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
            recyclerView_Type.setLayoutManager(dateLayoutManager);
            recyclerView_Type.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                    super.onScrollStateChanged(recyclerView, newState);
                    synchronized (this) {
                        if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                            calculatePositionAndScroll_Type(recyclerView);
                        }
                    }
                }

                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);
                    allPixelsDate += dx;
                }
            });
            if (mTypeBeanArrayList == null) {
                mTypeBeanArrayList = new ArrayList<>();
            }
            getMedicationType();
            Type_Adapter = new Medication_Type_RecyclerAdapter(Add_Reminder_medicationlook_Activity.this, mTypeBeanArrayList, (int) firstItemWidthDate);
            recyclerView_Type.setAdapter(Type_Adapter);
            Type_Adapter.setSelecteditem(Type_Adapter.getItemCount() - 1);
            return true;
        }
    });
}

private void getMedicationType() {

    for (int i = 0; i < mTypeBeanArrayList.size(); i++) {
        Medication_TypeBean medication_typeBean = mTypeBeanArrayList.get(i);


        Log.print("Image name :" +medication_typeBean.getType_image_name());
        if (i == 0 || i == (mTypeBeanArrayList.size() - 1)) {
            medication_typeBean.setType(VIEW_TYPE_PADDING);
        } else {
            medication_typeBean.setType(VIEW_TYPE_ITEM);
        }
        mTypeBeanArrayList.set(i, medication_typeBean);

    }
}

/*这是最重要的,如果预期的位置日期

private void calculatePositionAndScroll_Type(RecyclerView recyclerView) {
    int expectedPositionDate = Math.round((allPixelsDate + paddingDate - firstItemWidthDate) / itemWidthDate);

    if (expectedPositionDate == -1) {
        expectedPositionDate = 0;
    } else if (expectedPositionDate >= recyclerView.getAdapter().getItemCount() - 2) {
        expectedPositionDate--;
    }
    scrollListToPosition_Type(recyclerView, expectedPositionDate);

}

/* this if most important, if expectedPositionDate < 0 recyclerView will return to nearest item*/
private void scrollListToPosition_Type(RecyclerView recyclerView, int expectedPositionDate) {
    float targetScrollPosDate = expectedPositionDate * itemWidthDate + firstItemWidthDate - paddingDate;
    float missingPxDate = targetScrollPosDate - allPixelsDate;
    if (missingPxDate != 0) {
        recyclerView.smoothScrollBy((int) missingPxDate, 0);
    }
    setTypeValue();

}

private void setTypeValue() {
    int expectedPositionDateColor = Math.round((allPixelsDate + paddingDate - firstItemWidthDate) / itemWidthDate);
    int setColorDate = expectedPositionDateColor + 1;

    Type_Adapter.setSelecteditem(setColorDate);
    mTxt_type_name.setText(mTypeBeanArrayList.get(setColorDate).getMedication_type_name());

    mSELECTED_TYPE_ID = setColorDate;

    //NotifyLookChangetoType(setColorDate);
}

//类型适配器

 public class Medication_Type_RecyclerAdapter extends RecyclerView.Adapter<Medication_Type_RecyclerAdapter.ViewHolder> {

    private ArrayList<Medication_TypeBean> medication_typeBeanArrayList;
    private static final int VIEW_TYPE_PADDING = 1;
    private static final int VIEW_TYPE_ITEM = 2;
    private int paddingWidthDate = 0;
    private Context mContext;
    private int selectedItem = -1;

    public Medication_Type_RecyclerAdapter(Context context, ArrayList<Medication_TypeBean> dateData, int paddingWidthDate) {
        this.medication_typeBeanArrayList = dateData;
        this.paddingWidthDate = paddingWidthDate;
        this.mContext = context;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == VIEW_TYPE_ITEM) {
            final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_medication_type,
                    parent, false);
            return new ViewHolder(view);
        } else {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_medication_type,
                    parent, false);
            RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) view.getLayoutParams();
            layoutParams.width = paddingWidthDate;
            view.setLayoutParams(layoutParams);
            return new ViewHolder(view);
        }
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Medication_TypeBean medication_typeBean = mTypeBeanArrayList.get(position);
        if (getItemViewType(position) == VIEW_TYPE_ITEM) {
            // holder.mTxt_Type.setText(medication_typeBean.getMedication_type_name());
            //holder.mTxt_Type.setVisibility(View.VISIBLE);
            holder.mImg_medication.setVisibility(View.VISIBLE);
            int d = R.drawable.ic_type_pill;
            try {
                //Due to Offline requirements we do code like this get the images from our res folder

                if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_pill")) {
                    d = R.drawable.ic_type_pill;
                } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_patch")) {
                    d = R.drawable.ic_type_patch;
                } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_capsule")) {

                    d = R.drawable.ic_type_capsule;

                } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_ring")) {

                    d = R.drawable.ic_type_ring;

                } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_inhaler")) {

                    d = R.drawable.ic_type_inhaler;


                } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_spray")) {

                    d = R.drawable.ic_type_spray;


                } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_bottle")) {

                    d = R.drawable.ic_type_bottle;

                } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_drop")) {

                    d = R.drawable.ic_type_drop;


                } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_pessaries")) {

                    d = R.drawable.ic_type_pessaries;

                } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_sachets")) {

                    d = R.drawable.ic_type_sachets;


                } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_tube")) {

                    d = R.drawable.ic_type_tube;


                } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_suppository")) {

                    d = R.drawable.ic_type_suppository;

                } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_injaction")) {

                    d = R.drawable.ic_type_injaction;

                } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_spoon")) {

                    d = R.drawable.ic_type_spoon;

                } else if (medication_typeBean.getType_image_name().equalsIgnoreCase("ic_type_powder")) {

                    d = R.drawable.ic_type_powder;

                } else {
                    d = R.drawable.ic_type_pill;
                }

                Bitmap icon = BitmapFactory.decodeResource(mContext.getResources(),
                        d);
                holder.mImg_medication.setImageBitmap(icon);
            } catch (Exception e) {
                Log.print(e);
            }


            //     BitmapDrawable ob = new BitmapDrawable(mContext.getResources(), icon);
            //  img.setBackgroundDrawable(ob);
            // holder.mImg_medication.setBackground(ob);

            // Log.print("Type Adapter", "default " + position + ", selected " + selectedItem);
            if (position == selectedItem) {
                Log.print("Type adapter", "center" + position);
                //  holder.mTxt_Type.setTextColor(Color.parseColor("#76FF03"));
                //holder.mImg_medication.setColorFilter(Color.GREEN);
                //   holder.mTxt_Type.setTextSize(35);
                holder.mImg_medication.getLayoutParams().height = (int) mContext.getResources().getDimension(R.dimen.item_dob_width) + 10;
                holder.mImg_medication.getLayoutParams().width = (int) mContext.getResources().getDimension(R.dimen.item_dob_width) + 10;
            } else {
                holder.mImg_medication.getLayoutParams().height = (int) mContext.getResources().getDimension(R.dimen.item_dob_width) - 10;
                holder.mImg_medication.getLayoutParams().width = (int) mContext.getResources().getDimension(R.dimen.item_dob_width) - 10;
                //  holder.mTxt_Type.setTextColor(Color.WHITE);
                //holder.mImg_medication.setColorFilter(null);
                //  holder.mTxt_Type.setVisibility(View.INVISIBLE);
                // holder.mTxt_Type.setTextSize(18);
                //   holder.mImg_medication.getLayoutParams().height = 70;
                //   holder.mImg_medication.getLayoutParams().width = 70;
            }
        } else {
            holder.mImg_medication.getLayoutParams().height = (int) mContext.getResources().getDimension(R.dimen.item_dob_width) - 10;
            holder.mImg_medication.getLayoutParams().width = (int) mContext.getResources().getDimension(R.dimen.item_dob_width) - 10;
            //  holder.mTxt_Type.setVisibility(View.INVISIBLE);
            holder.mImg_medication.setVisibility(View.INVISIBLE);
        }
    }

    public void setSelecteditem(int selecteditem) {
        this.selectedItem = selecteditem;
        notifyDataSetChanged();

        if (medication_lookBeanArrayList != null && Look_Adapter != null) {
            NotifyLookChangetoType(selecteditem);
        }
    }

    public int getSelecteditem() {
        return selectedItem;
    }

    @Override
    public int getItemCount() {
        return medication_typeBeanArrayList.size();
    }

    @Override
    public int getItemViewType(int position) {
        Medication_TypeBean medication_typeBean = medication_typeBeanArrayList.get(position);
        if (medication_typeBean.getType() == VIEW_TYPE_PADDING) {
            return VIEW_TYPE_PADDING;
        } else {
            return VIEW_TYPE_ITEM;
        }
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        //public TextView mTxt_Type;
        public ImageView mImg_medication;

        public ViewHolder(View itemView) {
            super(itemView);
            //  mTxt_Type = (TextView) itemView.findViewById(R.id.mTxt);
            mImg_medication = (ImageView) itemView.findViewById(R.id.mImg_medication);
        }
    }
}

//Type Adapter ends ************************************************

共有1个答案

南门欣怡
2023-03-14

我不确定是否正确获取了您的信息,但您希望更改一个recyclerview的数据并重置另一个recyclerview的值

尝试使用recyclerView。滚动位置(要滚动到的索引);

如果你想达到数据的中心位置,使用recyclerview.scrollToPoplace(arraylist.size()/2);存储可绘制数据的arrayList

 类似资料:
  • 我有一个水平ScrollView,它有两个元素:CardView和水平RecycerView。所以,当用户水平滚动时,我希望这两个元素滚动。 我想有这样的东西:Goal,橙色的线是CardView,黄色的线是RecycerView。当用户滚动时,两个元素滚动,如下所示:Scrolled Goal。 现在在我的应用程序中,当用户滚动时,只有RecycerView滚动。CardView保持在他的位置。

  • 我在类似的问题中搜索过,试过几个答案都没有解决..我有显示城市名称和一些数据的水平回收器视图,问题是我在主回收器视图适配器中的每个位置放置了如下图所示的画布条形图或RV图表,为了水平滚动该图表,我将图表放在水平滚动视图中,以便在从右向左滚动该图表时查看长水平方向上的图表数据,反之亦然,但实际上它并不水平滚动,只有主回收器视图水平滚动到 当触摸它时显示城市,当触摸它滚动(冻结)时RV内的图表没有滚动

  • 我正在制作一个应用程序,其中我使用和类来制作一个可滚动的水平卡片堆栈。我已经成功地实现了,但我的问题是刷卡向右的方向,我想刷卡向左的方向。 我对SO做了一些研究,发现了1和2 更新:我仍然在努力,几乎没有发现很多,因为它仍然很难改变滚动的方向在回收,所以任何人仍然想帮助我,是欢迎的。 我还发现方法传递滚动位置和direcion可能我错了,但beow code可能是解决方案 我的主要班级 这是我的s

  • 我想做的从右到左滚动与我猜将是一个recylcer视图,但不确定是否是这个。我只是需要有人给我指明正确的方向。我想我需要一个内部布局的回收视图。 如果有人能指点我在哪里找到答案,我会变得很伟大!

  • 我有一个表,在某些列中有比较长的值,并且在我的Grails应用程序中为它打开了动态支架(我使用的是Grails3.3.8)。因此,在某些屏幕分辨率下,它们不在屏幕上,最右边的列最终会出现在屏幕之外--问题是,水平滚动条不会出现,所以用户甚至不知道它们在那里。把它们带回来的唯一方法是缩小--你不能用条形(因为它不在那里)或鼠标滚轮滚动;箭也不管用。 我如何修复这一点,使水平滚动条出现在内容超过屏幕大

  • 所以我在垂直ScrollView中有一个水平回收器视图。我的布局中的所有内容都显示得很好,并且都按照我想要的方向滚动,并且它做得很好。 我唯一的问题是,RecyclerView位于ScrollView中其他内容的下方,当RecyclerViewer部分可见时,它会在启动时将RecyclerView的底部与屏幕的底部对齐。这意味着RecyclerView上方的内容被推离屏幕。 有谁知道为什么会发生这