简体   繁体   English

滚动时如何使用回收者视图识别节适配器的子项的位置

[英]How to identify the position of child item of section adapter using recycler view while scrolling

I have a recycler view which has section adapter which consists of chat messages and we have ids for every message. 我有一个回收站视图,其中有部分适配器,其中包括聊天消息,每个消息都有ID。 On click of message we are able to get the ids of messages but what i want is to get the id of particular message which is currently visible on the screen. 在单击消息时,我们能够获取消息的ID,但我要获取的是当前在屏幕上可见的特定消息的ID。 At a time only one message will be visible to the user so we need to get the id of that particular message which is present on the screen. 一次,用户只能看到一条消息,因此我们需要获取屏幕上显示的特定消息的ID。 Below is my app screenshot. 以下是我的应用截图。

Screenshot 屏幕截图

  @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int section, int relativePosition, int absolutePosition) {

        String header1 = header.get(section);

        allData = mArrChildHashMap.get(header1);

        String Message = allData.get(relativePosition).getMessage();
        String MessageId = allData.get(relativePosition).getMessageId();
..................
...................
        String ticketId = allData.get(relativePosition).getTicketId();
        String AcceptFlag = checkNull(allData.get(relativePosition).getTicketAccepted());
        String ExpiryTime = checkNull(allData.get(relativePosition).getExpiryTime());
        ItemViewHolder itemViewHolder = (ItemViewHolder) holder;


            //Ticket
            itemViewHolder.Timer.setVisibility(View.VISIBLE);
            itemViewHolder.ticket.setVisibility(View.VISIBLE);
            itemViewHolder.ticketTitle.setText(Message);
            itemViewHolder.Message.setVisibility(View.GONE);
            setTicketStatus(itemViewHolder , ticketType);


        if(owner.equals("YES")){

            RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
            lp.setMargins(150, 0, 0, 0);
            itemViewHolder.mLayout.setLayoutParams(lp);

            if(messageType.equals("1"))
            {
                itemViewHolder.mLayout.setBackgroundResource(R.drawable.bubble2);
            }else {
                itemViewHolder.mLayout.setBackgroundResource(0);
            }
            lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

           // itemViewHolder.mLayout.setGravity(Gravity.RIGHT);
            itemViewHolder.Tick.setVisibility(View.VISIBLE);
            itemViewHolder.Accept.setVisibility(View.INVISIBLE);
           // itemViewHolder.status.setVisibility(View.VISIBLE);
            if(deliveryFlag.equals("YES")){
           //     itemViewHolder.status.setText("Deliv");
                itemViewHolder.Tick.setBackgroundResource(R.drawable.check);
            }

            itemViewHolder.itemLongClick(Message,section,relativePosition,longClickListener);

        }else{

            RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
            lp.setMargins(0, 0, 150, 0);

            lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT);

            itemViewHolder.mLayout.setLayoutParams(lp);
            itemViewHolder.Accept.setVisibility(View.VISIBLE);

            if(messageType.equals("1"))
            {
                itemViewHolder.mLayout.setBackgroundResource(R.drawable.bubble1);
            }else {
                itemViewHolder.mLayout.setBackgroundResource(0);
            }



            itemViewHolder.status.setVisibility(View.GONE);
            itemViewHolder.Tick.setVisibility(View.GONE);
        }
        itemViewHolder.Message.setText(Message);
        itemViewHolder.sampleTime.setText(time);
        itemViewHolder.name.setText(name);
        if(name.equals("")){
            itemViewHolder.name.setVisibility(View.GONE);
        }else {
            itemViewHolder.name.setVisibility(View.VISIBLE);
        }
        if(AcceptFlag.equals("1")){
            itemViewHolder.Accept.setVisibility(View.GONE);
          //  itemViewHolder.Accept.setText("Accepted");
            itemViewHolder.Timer.setVisibility(View.VISIBLE);
        }

        if(!ExpiryTime.equals("0")){
            customRunnable = new CustomRunnable(handler,itemViewHolder.Timer,Long.parseLong(ExpiryTime));
            handler.removeCallbacks(customRunnable);
            customRunnable.holder =  itemViewHolder.Timer;
            customRunnable.millisUntilFinished = Long.parseLong(ExpiryTime); 

    }

        itemViewHolder.itemLongClick(Message,section,relativePosition,longClickListener);
        itemViewHolder.OnAcceptClick(ticketId,section,absolutePosition,onClickListener);
        itemViewHolder.OnTimerClick(ticketId,section,absolutePosition,onClickListener);

    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, boolean header) {
        View v = null;
        if (header)

        {
            v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.list_item_section1, parent, false);
            return new SectionViewHolder(v);
        } else {
            v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.list_item_section, parent, false);
            return new ItemViewHolder(v);
        }

    }

I have tried the below code to get the id of the message while scrolling 我试过下面的代码以滚动时获取消息的ID

mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);

            overallXScroll = overallXScroll + dx;

            Log.i("check","overall->" + overallXScroll);

        }
    });

I am getting below output 我低于输出

05-12 15:08:03.451 22694-22694/com...... E/check: overall->0 05-12 15:08:03.467 22694-22694/com...... E/check: overall->0 05-12 15:08:03.451 22694-22694 / com ...... E / check:总体-> 0 05-12 15:08:03.467 22694-22694 / com ...... E / check:总体-> 0

Try method isViewPartiallyVisible from LayoutManager. 从LayoutManager尝试try方法isViewPartiallyVisible

In your adapter, you can get de LayoutManager from the recyclerView, which you can get from the onAttachedToRecyclerView event. 在适配器中,您可以从recyclerView获取de LayoutManager,可以从onAttachedToRecyclerView事件获取。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在android中滚动时放大Recycler View中心项目? - How to scale up Recycler View center item while scrolling in android? 如何在回收器适配器外部的回收器视图中获取当前项目的位置 - How tot get the position of current item in a recycler view outside the recycler adapter 滚动时的回收者视图项目淡出动画 - Recycler view item fadeout animation while scrolling 如何通过项目的参数在回收适配器中获取项目 position? - How to get item position in recycler adapter by item's parameter? Recycler视图 - 滚动时调整项目视图的大小(对于旋转木马效果) - Recycler view - resizing item view while scrolling (for carousel like effect) 如何将可拆分数组列表添加到部分回收器视图适配器 - How to add parcelable arraylist to section recycler view adapter 如何通过位置android在回收器视图中突出显示项目 - How to highlight a item in recycler view by position android 如何在回收站视图中更改项目的位置 - How to change position of item in Recycler View 取出物品时如何在回收站适配器中保持位置? - How can i maintain position in recycler adapter when removing an item? Android回收站查看onItem点击识别适配器 - Android recycler view onItemClick identify the adapter
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM