【问题标题】:How to set item to center of Recycler view when selected选择时如何将项目设置为回收站视图的中心
【发布时间】:2016-04-19 16:35:48
【问题描述】:

我正在使用RecyclerView 水平显示项目。我想像这样将所选项目设置为视图的中心

.

这就是我的做法:

LinearLayoutManager layoutManager
                = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(layoutManager);

【问题讨论】:

  • 请提供您希望实现的目标以及迄今为止尝试过的目标的屏幕截图
  • 尝试使用 ViewPager 代替 RecyclerView。
  • @Ravi 你有解决办法吗?
  • 有类似的问题。这个答案可以帮助你:stackoverflow.com/a/34647005/5371091

标签: android android-recyclerview


【解决方案1】:

您可以用最少的代码行实现相同的输出。其中,view 是所选适配器项的视图,StaticData.SCREEN_WIDTH 是设备宽度。

    View view = rvCategory.getChildAt(pos);
    if (view == null)
        return;
    int scrollX = (view.getLeft() - (StaticData.SCREEN_WIDTH / 2)) + (view.getWidth() / 2);
    rvCategory.smoothScrollBy(scrollX, 0);

【讨论】:

    【解决方案2】:

    要从 RecyclerView 获取屏幕上的中间项目,您可以将 OnScrollListener 附加到 RecyclerView 和内部侦听器,您应该获取当前项目的位置,然后您应该检查给定项目的区域是否在屏幕中间。

    Kotlin 中的代码示例:

    // Attach OnScrollListener to your RecyclerView
    addOnScrollListener(object : RecyclerView.OnScrollListener() {
        override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
            recyclerView.post {
                selectMiddleItem()
            }
        }
    })
    
    // implementation of method that is called from OnScrollListener
    private fun selectMiddleItem() {
        val firstVisibleIndex = layoutManager.findFirstVisibleItemPosition()
        val lastVisibleIndex = layoutManager.findLastVisibleItemPosition()
        val visibleIndexes = listOf(firstVisibleIndex..lastVisibleIndex).flatten()
    
        for (i in visibleIndexes) {
            val vh = findViewHolderForLayoutPosition(i)
            if (vh?.itemView == null) {
                continue
            }
            val location = IntArray(2)
            vh.itemView.getLocationOnScreen(location)
            val x = location[0]
            val halfWidth = vh.itemView.width * .5
            val rightSide = x + halfWidth
            val leftSide = x - halfWidth
            val isInMiddle = screenWidth * .5 in leftSide..rightSide
            if (isInMiddle) {
                // "i" is your middle index and implement selecting it as you want 
                // optionsAdapter.selectItemAtIndex(i)
                return
            }
        }
    }
    

    结果你应该得到这样的结果:

    【讨论】:

    • 这是什么 ->? findViewHolderForLayoutPosition
    • @DPrince 这是来自 RecyclerView 类的方法。在这里查看:developer.android.com/reference/android/support/v7/widget/…
    • @NayMak 在 Android Studio 中,您可以自动将代码从 kotlin 转换为 java,反之亦然
    • 这是什么-> selectItemAtIndex @PawełKanarek
    • @PawełKanarek 你能给我详细信息吗?
    【解决方案3】:

    这用于在滚动或单击项目时将项目捕捉到中心。

    您需要将 SnapHelper 添加到 RecyclerView。方法如下:

    final RecyclerView recyclerViewObject = view.findViewById(R.id.recyclerViewObjectId);
    
    final LinearSnapHelper snapHelper = new LinearSnapHelper();
    snapHelper.attachToRecyclerView(recyclerViewObject);
    
    recyclerViewObject.setOnFlingListener(snapHelper);
    

    那么你只需调用这段代码

    recyclerViewObject.addOnItemTouchListener(
                new RecyclerItemClickListener(getContext(), recyclerViewObject ,new RecyclerItemClickListener.OnItemClickListener() {
                    @Override public void onItemClick(View view, int position) {
                        recyclerViewObject.smoothScrollToPosition(position);
                    }
    
                    @Override public void onLongItemClick(View view, int position) {
                    }
                })
        );
    

    【讨论】:

      【解决方案4】:

      请尝试这种解决方案:

      LinearLayoutManager layoutManager = ((LinearLayoutManager)recyclerView.getLayoutManager());
      int totalVisibleItems = layoutManager.findLastVisibleItemPosition() - layoutManager.findFirstVisibleItemPosition()    
      int centeredItemPosition = totalVisibleItems / 2;
          recyclerView.smoothScrollToPosition(position);
          recyclerView.setScrollY(centeredItemPosition );
      

      希望这会有所帮助。

      【讨论】:

      • recyclerview 没有getLastVisiblePosition,getFirstVisiblePosition 和smoothScrollByOffset 在recyclerView 中不可用。
      • 感谢 Saeed,但是 getLastVisiblePosition 和 getFirstVisiblePosition 在 recyclerview 中不可用。
      • @ravi 这些是LayoutManager 方法
      • 旁注:如果视图大小不同,那么这将无法完全按预期工作。它在不考虑孩子宽度的情况下将孩子的数量除以 2。所以你会得到中间的孩子,但你可能不会让孩子在视图的中心。
      • recyclerView.smoothScrollToPosition(位置);哪个位置?
      猜你喜欢
      • 2017-05-11
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多