如何在水平RecyclerView中获取当前位置?

9

我有一个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();
    }
}

这是我的活动(Activity)

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
                }
            }
        });

你的活动代码在哪里?你的适配器呢?把它们都放在这里。 - Luiz Fernando Salvaterra
@LuizFernandoSalvaterra 我把它们拉过来 - Mohsen mokhtari
不需要点击,你只需滚动RecyclerView到特定位置,就可以实现这个功能。 - Luiz Fernando Salvaterra
@LuizFernandoSalvaterra 是的,我只想通过滚动来进行更改。 - Mohsen mokhtari
2个回答

25
 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();
这使得水平滚动视图一次展示和滚动整个项目,因此您不能像半可见和另一半不可见那样在中间卡住。

1
这个解决方案非常简单,简直是优雅的。我一直在使用无限复杂的代码来完成同样的事情。 - Jason Sznol
2
这个解决方案不准确。即使你在边缘(最后/第一个项目),SCROLL_STATE_IDLE状态也会被调用,每次滑动都会触发此状态。 - Alex

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));

                    }

                }
            });

2
虽然这段代码片段可能解决问题并提供一些有限的即时帮助,但是适当的解释会极大地提高其长期价值,因为它展示了为什么这是一个好的问题解决方案,并使其对未来读者更有用,特别是那些有其他类似问题的读者。请考虑[编辑]您的答案以添加一些解释,包括您所做的假设。 - ButchMonkey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接