目前我正在使用ListView
它,它工作正常。但是我有一个ListView
类似于段落的文本,我只想显示这 2 行文本并使其余文本可滚动,但我遇到一个问题,如果我TextView
在获得其父 ( ) 的焦点,并且不会让它滚动。ListView
TextView
ListView
那么我可以实现这种TextView
不会干扰滚动属性的可滚动功能ListView
吗?
谢谢你。
我能够通过以下方式做到这一点:
进入ListAdapter的getView方法获取该行的TextView对象,并写入
textView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.getParent().getParent().requestDisallowInterceptTouchEvent(true);
return false ;
}
});
当您触摸 TextView 时,控制滚动
你想要达到的目标真的是不可能的。操作系统如何知道您正在尝试滚动列表与列表行段落?在实际列表本身可以滚动之前,您基本上需要滚动到列表行段落的底部。这让用户感到困惑,而不是常见的 UX。
我建议您查看ExpandableListView。它允许您拥有每一行的折叠版本,在您的情况下,每个列表行只有 2 行文本。当用户点击该行时,它可以扩展为完整的段落形式,并且列表将一直可滚动。您应该可以在网上找到很多教程。
没有什么是不可能的,但做事的方式可能很困难。直接这件事不能实现,但间接是可以实现的,是的,我实现了。我是如何实现的有点复杂,但是是的,我会分享我是如何实现的。
在ListView
我单击时,Textview
我阻止了 listView 的 Touch 模式,以便它们的 toch 方法不会相互拦截,这可以通过使用 父级 ( )的requestDisallowInterceptTouchEvent(true);
此块来完成。TouchListener
ListView
现在,当单击时,TextView
我允许它的触摸侦听器和setMovementMethod
(),但是对于运动,我创建了一个自定义类,并且类正在关注
public class myScrollMethod extends ScrollingMovementMethod {
@Override
public void onTakeFocus(TextView widget, Spannable text, int dir) {
// TODO Auto-generated method stub
super.onTakeFocus(widget, text, dir);
}
@Override
public boolean onKeyDown(TextView widget, Spannable buffer,
int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_DOWN:
for (int i = 0, scrollAmount = getScrollAmount(widget); i < scrollAmount; i++) {
down(widget, buffer);
}
return true;
case KeyEvent.KEYCODE_DPAD_UP:
for (int i = 0, scrollAmount = getScrollAmount(widget); i < scrollAmount; i++) {
up(widget, buffer);
}
return true;
default:
return super.onKeyDown(widget, buffer, keyCode, event);
}
}
private int getScrollAmount(TextView widget) {
final int visibleLineCount = (int) ((1f * widget.getHeight()) / widget
.getLineHeight());
int scrollAmount = visibleLineCount - 1;
if (scrollAmount < 1) {
scrollAmount = 1;
}
return scrollAmount;
}
}
之后,当我单击父项时,我启用父项设置为 true 的 TouchIntercepter 并保持其父项并开始滚动。
通过这种方式,我成功地达到了这个要求