【问题标题】:How to get current position in horizontal recyclerview?如何在水平回收器视图中获取当前位置?
【发布时间】:2020-01-31 14:30:51
【问题描述】:

我有一个 recyclerview 和一个 imageview,我想在滚动时更改 imageview 图像,但我不知道如何获取当前位置并通过它从列表中获取我的图像,然后将它与 Picasso 一起加载到 imageview!

这是我的代码:

<ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/main_background"
        android:background="#80000000"
        android:scaleType="centerCrop"
        />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="400dp"
        android:layout_centerInParent="true"
        android:layout_marginBottom="30dp"
        android:layout_marginTop="30dp"/>

我的适配器:

public class Place_Adapter extends RecyclerView.Adapter<Place_View_Holder> {
    private List<Place> objects;
    private Activity context;

    public Place_Adapter(List<Place> objects,Activity context){
        this.context=context;
        this.objects=objects;

    }

    @Override
    public Place_View_Holder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.place_item, parent, false);
        Place_View_Holder place_view_holder=new Place_View_Holder(v);
        return place_view_holder;
    }

    @Override
    public void onBindViewHolder(Place_View_Holder holder, int position) {
        Picasso.with(context)
                .load(objects.get(position).getItem_Image())
                .placeholder(R.mipmap.image)
                .error(R.mipmap.image)
                .into(holder.image);
        holder.place_name.setText(objects.get(position).getPName());
        holder.place_in_map.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                context.startActivity(new Intent(context, MapsActivity.class));
            }
        });

    }

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

这是我的活动

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                    ////here i want to change imageview image
                }
            }
        });

【问题讨论】:

  • 您的活动代码在哪里?和你的适配器?把它们都放在这里
  • @LuizFernandoSalvaterra 我拉他们
  • 你想在没有点击的情况下这样做吗?只是在某个位置滚动回收视图?
  • @LuizFernandoSalvaterra 是的,我想通过滚动来更改。

标签: android android-recyclerview


【解决方案1】:
 SnapHelper mSnapHelper = new PagerSnapHelper();
 mSnapHelper.attachToRecyclerView(recyclerView);
 LayoutManager recylerViewLayoutManager = new LayoutManager(view.getContext(), LinearLayoutManager.HORIZONTAL, false) ;;
 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
                   //Dragging 
                } else if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                    review_position = recylerViewLayoutManager.findFirstVisibleItemPosition();
                 /*
                    Here load the Image to image view with picaso
                 */
                 Picasso.with(itemView.getContext())
                    .load(url)
                    .into(yourImageView, new Callback() {
                        @Override
                        public void onSuccess() {

                        }

                        @Override
                        public void onError() {

                        }
                    });
                }
            }
        }

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

            int firstVisibleItem = recylerViewLayoutManager.findFirstVisibleItemPosition();
               /* Log.e ("VisibleItem", String.valueOf(firstVisibleItem));*/

        }
    });

这里

SnapHelper mSnapHelper = new PagerSnapHelper();

这使得水平回收器视图一次显示和滚动整个项目,这样你就不会像一半可见而另一半不可见那样卡在中间

【讨论】:

  • 这个解决方案非常简单,非常优雅。我一直在使用复杂得多的代码来做同样的事情。
  • 此解决方案不准确。 SCROLL_STATE_IDLE 状态即使你在边缘(最后/第一个项目)也会调用,每次滑动都会触发这个状态。
【解决方案2】:

从 Recycleview 中查找当前项目的位置

recyclerView.addOnScrollListener ( new RecyclerView.OnScrollListener() {  

              @Override
                public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                    super.onScrollStateChanged(recyclerView, newState);

                    if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
                        //Dragging
                    } else if (newState == RecyclerView.SCROLL_STATE_IDLE) {

                        int position = linearLayoutManager.findFirstVisibleItemPosition();
                        Log.e("position", String.valueOf(position));

                    }

                }
            });

【讨论】:

  • 虽然此代码 sn-p 可能会解决问题并提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请考虑edit您的回答以添加一些解释,包括您所做的假设。
猜你喜欢
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
相关资源
最近更新 更多