Android RecyclerView在滚动时,焦点上的项目会展开

7
我正在尝试为我的Android TV应用程序实现一种效果,即在视图聚焦时扩展视图。我通过对ViewHolder的主视图的LayoutParams进行动画处理来实现这一点。它运行良好,但问题是当我滚动到视图的末尾(水平LinearLayout)时,视图扩展与视图的末尾不对齐,从而导致非常奇怪的效果。

RecyclerView strange scrolling

这是我的代码:

holder.m_view.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean b) {
                if (b)
                {
                    ResizeAnimation anim = new ResizeAnimation(view, 600, view.getWidth());
                    anim.setDuration(200);
                    anim.setInterpolator(new AccelerateDecelerateInterpolator());
                    view.startAnimation(anim);
                }
                else
                {
                    ResizeAnimation anim = new ResizeAnimation(view, 400, view.getWidth());
                    anim.setDuration(200);
                    anim.setInterpolator(new AccelerateDecelerateInterpolator());
                    view.startAnimation(anim);
                }

            }
        });
ResizeAnimation 是我自己编写的一个类,用于更改视图的 LayoutParams。如何解决奇怪的滚动问题?谢谢。

你有得到任何解决方案吗? - Maddy
很遗憾,我不得不转而使用Android Leanback的库,它会确保所查看的项目始终位于视图的中心,因此这种情况不会发生。 - gkpln3
3个回答

0

这对我有用,我只需要在焦点项目上设置白色轮廓。

holder.itemView.setOnFocusChangeListener { focusedView, hasFocus ->
            if (hasFocus) {
                focusedView.findViewById<LinearLayout>(R.id.linearlyt_gallery_item)                
                    .setBackgroundResource(R.drawable.selector_imageview_focus)
            } else {
                focusedView.findViewById<LinearLayout>(R.id.linearlyt_gallery_item)
                    .setBackgroundResource(0)
            }
        }

//selector_imageview_focus.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    android:constantSize="true">
    <item android:state_selected="true">
        <shape android:shape="rectangle">
            <solid android:color="#FFFFFF"/>
            <stroke android:width="@dimen/imageview_outline" android:color="#FFFFFF"/>
            <padding android:left="@dimen/imageview_outline"
                android:top="@dimen/imageview_outline"
                android:right="@dimen/imageview_outline"
                android:bottom="@dimen/imageview_outline" />
        </shape>
    </item>
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <solid android:color="#FFFFFF"/>
            <stroke android:width="@dimen/imageview_outline" android:color="#FFFFFF"/>
            <padding android:left="@dimen/imageview_outline"
                android:top="@dimen/imageview_outline"
                android:right="@dimen/imageview_outline"
                android:bottom="@dimen/imageview_outline" />
        </shape>
    </item>
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#FFFFFF"/>
            <stroke android:width="@dimen/imageview_outline" android:color="#FFFFFF"/>
            <padding android:left="@dimen/imageview_outline"
                android:top="@dimen/imageview_outline"
                android:right="@dimen/imageview_outline"
                android:bottom="@dimen/imageview_outline" />
        </shape>
    </item>
</selector>

// 图像视图外框= 2dp


0

添加此视图 //活动视图

androidx.constraintlayout.widget.Placeholder

使你的屏幕居中或者达到期望位置

创建一个带有 FocusSwapTo(v) 方法的监听器接口

在 RecycleListAdapter 中添加回调接口

itemView.setOnFocusChangeListener((v, hasFocus) -> {
            if (hasFocus) { 
           if(listerner!=null)
           listerner.FocusSwapTo(v)
            }
        });

//// 主活动 实现回调

@override
public void FocusSwapTo(View view){
placeholder.setContentId(view.getId());    
}

0
将此添加到ViewHolder中。
itemView.setOnFocusChangeListener((v, hasFocus) -> {
            if (hasFocus) {
                ViewCompat.animate(v).scaleX(1.12f).scaleY(1.12f).setDuration(30).translationZ(1).start();
            } else {
                ViewCompat.animate(v).scaleX(1.0f).scaleY(1.0f).setDuration(10).translationZ(0).start();
            }
        });

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