我目前正在使用recyclerView和卡片。
我有卡片布局。现在我想在卡片中添加scrollview是可能的。如果是,那怎么样? 棕色布局是回收器视图布局,而蓝色布局是卡片布局。在每张卡片里面我需要滚动视图吗?
答案 0 :(得分:7)
我不确定这是否有用,但您可以试试这个
这可以像这样实现
//对于scrollView
scrollView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
// Disallow the touch request for parent scroll on touch of child view
view.getParent().requestDisallowInterceptTouchEvent(false);
return true;
}
});
看看这对你有帮助。
答案 1 :(得分:0)
试试这个。
public class NoInterceptScrollView extends ScrollView {
public NoInterceptScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return false;
}
}
答案 2 :(得分:0)
我终于找到了另一种在 RecyclerView viewHolder 中滚动 ScrollView 的方法。作为Ankit Khare's answer,为了实现这一点,我们应该在触摸ScrollView时禁用RecyclerView的触摸,但他的解决方案太简单了,我尝试后效果不佳。是的,我知道问题和答案都是 6 年前发布的,也许当时它有效,但现在我尝试后不再有效。
这是我的分析。我们应该禁用它的滚动机制,而不是禁用 RecyclerView 的触摸。为了可以禁用 RecyclerView 的滚动,我们应该使用 LayoutManager 中用于 RecyclerView 的函数 canScrollVertically()
。然后,在 RecyclerView 的适配器中,我为 ScrollView 实现了 onTouchListener()
以触发对其的触摸并禁用或启用 RecyclerView。所以,这是我的示例代码(我使用的是 Kotlin):
class MyActivity : AppCompatActivity(), MyAdapter.AdapterListener {
private var isVerticalScrollEnabled = true
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
/* Set RecyclerView adapter here */
recyclerView.apply {
layoutManager = object : LinearLayoutManager(this@MyActivity) {
override fun canScrollVertically(): Boolean {
return isVerticalScrollEnabled
}
}
adapter = MyAdapter(callback = this@MyActivity)
}
}
/**
* Callback from MyAdapter.AdapterListener.
*/
override fun onScrollViewTouched(isTouched: Boolean) {
isVerticalScrollEnabled = !isTouched
}
}
class MyAdapter internal constructor(private val callback: AdapterListener) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, i: Int) {
/* set touch listener for scrollview */
scrollView.setOnTouchListener(object : View.OnTouchListener {
override fun onTouch(v: View?, event: MotionEvent?): Boolean {
return when (event?.action) {
MotionEvent.ACTION_DOWN -> {
callback.onScrollViewTouched(isTouched = true)
true
}
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
callback.onScrollViewTouched(isTouched = false)
true
}
else -> {
/* return false so that scrollview can scroll the content */
false
}
}
}
})
}
internal interface AdapterListener {
fun onScrollViewTouched(isTouched: Boolean)
}
}
希望这对查找其他答案的人有所帮助。