单击包含 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.
我已经尝试过,但无济于事:
- 设置父 LinearLayout 的后代 Focusability="blocksDescendants"
- 添加可点击&
focusable="false" 到 TextViews
这是我的 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);
}
});
...允许 onItemClick
在 MainActivity
中(如果我按文本或线性布局,它会打开同样的东西)。
我有解决你问题的方法:在你的 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 数组,停止波纹。
应该有用!
我为我的 ListView 设置了自定义适配器。我还设置了默认项目选择波纹动画,以便在选择项目时出现 (android:background="?android:selectableItemBackground"
)。
但是,当我点击 TextViews 时,动画不会出现。 Here's a video.
我已经尝试过,但无济于事:
- 设置父 LinearLayout 的后代 Focusability="blocksDescendants"
- 添加可点击& focusable="false" 到 TextViews
这是我的 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);
}
});
...允许 onItemClick
在 MainActivity
中(如果我按文本或线性布局,它会打开同样的东西)。
我有解决你问题的方法:在你的 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 数组,停止波纹。
应该有用!