【发布时间】:2015-04-03 05:45:41
【问题描述】:
我目前正在使用 recyclerView 和卡片。
我有一个卡片布局。现在我想在卡片中添加滚动视图是可能的。如果是,那怎么办? 棕色布局是回收站视图布局,而蓝色布局是卡片布局。在每张卡片里面我需要一个滚动视图,这可能吗?
【问题讨论】:
标签: android android-recyclerview android-scrollview android-cardview
我目前正在使用 recyclerView 和卡片。
我有一个卡片布局。现在我想在卡片中添加滚动视图是可能的。如果是,那怎么办? 棕色布局是回收站视图布局,而蓝色布局是卡片布局。在每张卡片里面我需要一个滚动视图,这可能吗?
【问题讨论】:
标签: android android-recyclerview android-scrollview android-cardview
我不确定这是否可行,但你可以试试这个
可以这样实现
//对于滚动视图
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;
}
});
看看这对你有没有帮助。
【讨论】:
试试这个。
public class NoInterceptScrollView extends ScrollView {
public NoInterceptScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return false;
}
}
【讨论】:
我终于找到了另一种在 RecyclerView viewHolder 中滚动 ScrollView 的方法。作为Ankit Khare's answer,为了这个工作,我们应该在滚动视图被触摸时禁用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)
}
}
希望这对查找另一个答案的人有所帮助。
【讨论】: