单击包含 RecyclerView 的 ViewHolder 时如何重定向到另一个 activity?
How to be redirected to another activity when clicked on ViewHolder that contains a RecyclerView?
我正在使用 RecyclerView
来显示一些数据。对于每个项目,我都有一个自定义布局,在一些文本视图旁边有一个 RecyclerView
:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:layout_width="180dp"
android:layout_height="45dp"
android:id="@+id/recycler_view"/>
//Other text views
</RelativeLayout>
这是我的适配器class:
class UserViewHolder extends RecyclerView.ViewHolder {
View itemView;
RecyclerView recyclerView;
UserViewHolder(View itemView) {
super(itemView);
this.itemView = itemView;
recyclerView = itemView.findViewById(R.id.recycler_view);
}
void bind(User user) {
itemView.setOnClickListener(view -> {
//Move to user Activity
});
UserAdapter adapter = new UserAdapter(user.list);
recyclerView.setAdapter(adapter);
itemView.bringToFront(); //Doesn't work!!!
}
}
我在整个 itemView
上设置了点击侦听器,因此我可以被重定向到用户的 activity。问题是,当我单击 RecyclerView
中存在的元素时,我没有被重定向。我试图将 itemView
放在 RecyclerView
前面,但没有成功。我应该如何操作才能将我重定向到用户 activity,即使我单击 RecyclerView
?谢谢!
编辑:
这是我的 itemView 布局的样子:
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:clickable="true">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
//One TextView
//One ImageView
//One RecyclerView
</RelativeLayout>
</android.support.v7.widget.CardView>
这是它的图片:
很简单,您可以实现一个界面并从 activity / 片段中使用它,而不是尝试从适配器内在新屏幕上导航,其中 RecyclerView
是可见的。
示范[=16=]
class UserViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
View itemView;
RecyclerView recyclerView;
UserViewHolder(View itemView) {
super(itemView);
this.itemView = itemView;
recyclerView = itemView.findViewById(R.id.recycler_view);
}
@Override
public void onClick(View v) {
if (listener != null)
listener.onItemListClicked(getAdapterPosition());
}
void bind(User user) {
itemView.setOnClickListener(this);
UserAdapter adapter = new UserAdapter(user.list);
recyclerView.setAdapter(adapter);
itemView.bringToFront(); //Doesn't work!!!
}
}
接口应该放在 UserViewHolder
class 之外。
public interface MyClickListener{
void onItemListClicked(int position);
}
您将在适配器中有一个 public 方法,它将设置侦听器
public void setListenerForAdapter(MyClickListener listener) {
this.listener = listener;
}
最后在你的 activity 中将侦听器设置为适配器
adapter.setListener(/*here you will implement your custom listener and start a new activity / fragment based on which position was clicked*/);
如有任何其他问题,请随时提出。
编码愉快!
如果它是静态的activity并且它不会随时间改变,你可以做这样的事情,否则使用接口。
class UserViewHolder extends RecyclerView.ViewHolder {
View itemView;
RecyclerView recyclerView;
UserViewHolder(View itemView) {
super(itemView);
this.itemView = itemView;
recyclerView = itemView.findViewById(R.id.recycler_view);
}
void bind(User user) {
itemView.setOnClickListener(view -> {
view?.context?.startActivity(Intent(view?.context, YourDestinationActivity::class.java))
// this is kotlin code just parse it to java
});
UserAdapter adapter = new UserAdapter(user.list);
recyclerView.setAdapter(adapter);
itemView.bringToFront(); //Doesn't work!!!
}
据我了解,您希望通过单击 while 回收器 row/item 来重定向用户。然后,您需要使 itemView
的父布局可点击且可聚焦。您没有为 itemView
提供 xml 布局,但我会尽力解释。您的 itemView
是一个单独的 xml 布局文件,其中包含图像和文本框,它们都被添加到父 Linear/Constraint/Relative 布局中。此父布局需要 clickable = true
和 focusable = true
才能接受点击事件。
我们确定的问题是嵌套的回收器消耗了点击事件。如果嵌套回收器不希望滚动,则阻止此事件的方法是将 setLayoutFrozen(true)
添加到嵌套回收器。
教程link and docs
我正在使用 RecyclerView
来显示一些数据。对于每个项目,我都有一个自定义布局,在一些文本视图旁边有一个 RecyclerView
:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:layout_width="180dp"
android:layout_height="45dp"
android:id="@+id/recycler_view"/>
//Other text views
</RelativeLayout>
这是我的适配器class:
class UserViewHolder extends RecyclerView.ViewHolder {
View itemView;
RecyclerView recyclerView;
UserViewHolder(View itemView) {
super(itemView);
this.itemView = itemView;
recyclerView = itemView.findViewById(R.id.recycler_view);
}
void bind(User user) {
itemView.setOnClickListener(view -> {
//Move to user Activity
});
UserAdapter adapter = new UserAdapter(user.list);
recyclerView.setAdapter(adapter);
itemView.bringToFront(); //Doesn't work!!!
}
}
我在整个 itemView
上设置了点击侦听器,因此我可以被重定向到用户的 activity。问题是,当我单击 RecyclerView
中存在的元素时,我没有被重定向。我试图将 itemView
放在 RecyclerView
前面,但没有成功。我应该如何操作才能将我重定向到用户 activity,即使我单击 RecyclerView
?谢谢!
编辑:
这是我的 itemView 布局的样子:
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:clickable="true">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
//One TextView
//One ImageView
//One RecyclerView
</RelativeLayout>
</android.support.v7.widget.CardView>
这是它的图片:
很简单,您可以实现一个界面并从 activity / 片段中使用它,而不是尝试从适配器内在新屏幕上导航,其中 RecyclerView
是可见的。
示范[=16=]
class UserViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
View itemView;
RecyclerView recyclerView;
UserViewHolder(View itemView) {
super(itemView);
this.itemView = itemView;
recyclerView = itemView.findViewById(R.id.recycler_view);
}
@Override
public void onClick(View v) {
if (listener != null)
listener.onItemListClicked(getAdapterPosition());
}
void bind(User user) {
itemView.setOnClickListener(this);
UserAdapter adapter = new UserAdapter(user.list);
recyclerView.setAdapter(adapter);
itemView.bringToFront(); //Doesn't work!!!
}
}
接口应该放在 UserViewHolder
class 之外。
public interface MyClickListener{
void onItemListClicked(int position);
}
您将在适配器中有一个 public 方法,它将设置侦听器
public void setListenerForAdapter(MyClickListener listener) {
this.listener = listener;
}
最后在你的 activity 中将侦听器设置为适配器
adapter.setListener(/*here you will implement your custom listener and start a new activity / fragment based on which position was clicked*/);
如有任何其他问题,请随时提出。 编码愉快!
如果它是静态的activity并且它不会随时间改变,你可以做这样的事情,否则使用接口。
class UserViewHolder extends RecyclerView.ViewHolder {
View itemView;
RecyclerView recyclerView;
UserViewHolder(View itemView) {
super(itemView);
this.itemView = itemView;
recyclerView = itemView.findViewById(R.id.recycler_view);
}
void bind(User user) {
itemView.setOnClickListener(view -> {
view?.context?.startActivity(Intent(view?.context, YourDestinationActivity::class.java))
// this is kotlin code just parse it to java
});
UserAdapter adapter = new UserAdapter(user.list);
recyclerView.setAdapter(adapter);
itemView.bringToFront(); //Doesn't work!!!
}
据我了解,您希望通过单击 while 回收器 row/item 来重定向用户。然后,您需要使 itemView
的父布局可点击且可聚焦。您没有为 itemView
提供 xml 布局,但我会尽力解释。您的 itemView
是一个单独的 xml 布局文件,其中包含图像和文本框,它们都被添加到父 Linear/Constraint/Relative 布局中。此父布局需要 clickable = true
和 focusable = true
才能接受点击事件。
我们确定的问题是嵌套的回收器消耗了点击事件。如果嵌套回收器不希望滚动,则阻止此事件的方法是将 setLayoutFrozen(true)
添加到嵌套回收器。
教程link and docs