单击包含 TextView 的 ListView 项目的波纹动画将不起作用

Ripple animation of ListView item won't work by click on containing TextView

我为我的 ListView 设置了自定义适配器。我还设置了默认项目选择波纹动画,以便在选择项目时出现 (android:background="?android:selectableItemBackground")。 但是,当我点击 TextViews 时,动画不会出现。 Here's a video.

我已经尝试过,但无济于事:

这是我的 list_item.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawSelectorOnTop="true"
android:background="?android:selectableItemBackground"
android:orientation="vertical"
android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp">

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ellipsize="end"
    android:maxLines="1"
    android:textSize="18sp"
    android:textStyle="bold" />

<TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ellipsize="end"
    android:maxLines="1" />

</LinearLayout>

(编辑)在适配器 class 的 getView() 方法中,我在 return convertView 之前有这些:

    holder.title.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
            ((ListView) parent).performItemClick(v, position, 0); // Let the event be handled in onItemClick()
        }
    });

    holder.text.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ((ListView) parent).performItemClick(v, position, 0); // Let the event be handled in onItemClick()
        }
    });

    convertView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ((ListView) parent).performItemClick(v, position, 0);
        }
    });

...允许 onItemClickMainActivity 中(如果我按文本或线性布局,它会打开同样的东西)。

我有解决你问题的方法:在你的 getView() 中试试这个:

final RippleDrawable rippleDrawable = (RippleDrawable) convertView.getBackground();
final View finalParent = parent;
final int finalPosition = position;
View.OnTouchListener listener = new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {

        switch (motionEvent.getAction()) {
            case MotionEvent.ACTION_DOWN:
                rippleDrawable.setHotspot(motionEvent.getX(), motionEvent.getY());
                rippleDrawable.setState(new int[] {android.R.attr.state_pressed, android.R.attr.state_enabled});
                return true;
            case MotionEvent.ACTION_UP:
                rippleDrawable.setState(new int[0]);
                ((ListView)finalParent).performItemClick(view, finalPosition, 0);
                return true;
        }
        return false;
    }
};

第一行获取包含触摸的TextView的ListView项目的RippleDrawable。

当TextView被触摸时,获取触摸的坐标并通过setHotSpot将它们设置到RippleDrawable中,以指定波纹效果的起点。

之后,您通过使用 setState() 将包含状态 android.R.attr.state_pressed 和 android.R.attr.state_enabled 的 int 数组设置到 RippleDrawable 来触发涟漪效果。

当触摸结束时,将状态设置为一个空的 int 数组,停止波纹。
应该有用!