Android Recyclerview 多个点击项目
Android Recyclerview Multiple onclick items
我正在尝试拥有一个 recyclerview,其中每个项目都是一个简单的 TextView + Checkbox
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/title"
android:layout_width="0dp"
android:layout_weight="5"
android:layout_height="wrap_content"
/>
<CheckBox
android:id="@+id/chk"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content" />
</LinearLayout>
我想要实现的是(取消)选中复选框(如果它被单击)。但是如果textview被点击,那么在整个项目上做波纹动画并开始片段过渡。
我无法在网上找到示例,我找到的最接近的示例是 RecyclerView onClick
我设法让 onclick 起作用,但是,在代码中
@Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
View childView = view.findChildViewUnder(e.getX(), e.getY());
if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
mListener.onItemClick(childView, view.getChildPosition(childView));
return true;
}
return false;
}
我遇到的问题是返回的 childView 是线性布局,而不是文本视图或复选框。因此,我无法确定点击是在文本视图上还是在复选框上完成的。
有什么我想念的吗?理想情况下,如果有人有一个如何实现它的工作示例,那就太好了。
谢谢。
给你:
您的列表项xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="?attr/selectableItemBackground"
android:layout_height="72dp">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:text="My Text"
android:layout_gravity="left|center_vertical"
android:paddingLeft="16dp"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="16dp"
android:layout_gravity="right|center_vertical" />
(我使用 FrameLayout
作为根,但 LinearLayout
应该也可以。)
然后在 RecyclerView
的 Adapter
中使用如下内容:
@Override
public YourViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item, viewGroup, false);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.w("Test", "Parent clicked");
}
});
return new YourViewHolder(itemView);
}
@Override
public void onBindViewHolder(YourViewHolder viewHolder, int i) {
viewHolder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.w("Test", "Checkbox clicked");
}
});
}
我正在尝试拥有一个 recyclerview,其中每个项目都是一个简单的 TextView + Checkbox
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/title"
android:layout_width="0dp"
android:layout_weight="5"
android:layout_height="wrap_content"
/>
<CheckBox
android:id="@+id/chk"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content" />
</LinearLayout>
我想要实现的是(取消)选中复选框(如果它被单击)。但是如果textview被点击,那么在整个项目上做波纹动画并开始片段过渡。
我无法在网上找到示例,我找到的最接近的示例是 RecyclerView onClick
我设法让 onclick 起作用,但是,在代码中
@Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
View childView = view.findChildViewUnder(e.getX(), e.getY());
if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
mListener.onItemClick(childView, view.getChildPosition(childView));
return true;
}
return false;
}
我遇到的问题是返回的 childView 是线性布局,而不是文本视图或复选框。因此,我无法确定点击是在文本视图上还是在复选框上完成的。
有什么我想念的吗?理想情况下,如果有人有一个如何实现它的工作示例,那就太好了。
谢谢。
给你:
您的列表项xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="?attr/selectableItemBackground"
android:layout_height="72dp">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:text="My Text"
android:layout_gravity="left|center_vertical"
android:paddingLeft="16dp"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="16dp"
android:layout_gravity="right|center_vertical" />
(我使用 FrameLayout
作为根,但 LinearLayout
应该也可以。)
然后在 RecyclerView
的 Adapter
中使用如下内容:
@Override
public YourViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item, viewGroup, false);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.w("Test", "Parent clicked");
}
});
return new YourViewHolder(itemView);
}
@Override
public void onBindViewHolder(YourViewHolder viewHolder, int i) {
viewHolder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.w("Test", "Checkbox clicked");
}
});
}