gpt4 book ai didi

android - RecyclerView - 获取 Activity 内部的位置,而不是 RecyclerView 适配器

转载 作者:太空宇宙 更新时间:2023-11-03 11:38:58 24 4
gpt4 key购买 nike

现在是我处理 View 点击的第三天。我最初使用的是 ListView ,然后我切换到RecyclerView .我已添加 android:onclick我的 row_layout 上的每个控件的元素我正在我的MainActivity 中处理它们像这样:

public void MyMethod(View view) {}

在我的旧 ListView实现,我做了 setTag(position)能够得到它 MyMethod通过在其中执行此操作:
Integer.parseInt(view.getTag().toString())

这工作得很好,没有问题。虽然现在我正在处理 RecyclerView并被迫使用 ViewHolder ,它不提供 setTag方法。搜索了2个小时,发现有人用 setTag像这样:
holder.itemView.setTag(position)

这是可以接受的。虽然当我尝试从 MyMethod 获取值时使用以下行的函数:
Integer.parseInt(view.getTag().toString())

应用程序崩溃。我已经阅读了适配器内部的几个 onclick 处理实现,但我必须使用 MainActivity因为我正在使用该 Activity 独有的东西。

TL;DR 我想将点击行的位置发送到我的 MainActivity以简单的方式。

编辑:我为困惑道歉,因为我的主题不是很彻底。我有一个 RecyclerView和一个适配器。适配器链接到我的 row_layout .这个 row_layout xml 有一个根 LinearLayout .里面有一个 TextView , 另一个 LinearLayout (有两个 TextViews )和一个 Button (为简单起见)。我不想为处理 RecylerView 上的点击而受苦就像我对 ListView 所做的那样.所以,我决定添加一个 android:onclick对于每个控件,然后链接 TextViewLinearLayout到单个方法并链接 Button (以及 future 的 Button s)到他们独特的方法。我缺少的是我希望能够在我的 MainActivity 上告诉每个接收方法的位置。 .如果我必须链接来自适配器的所有内容并进入 MainActivity到单个 onclick 处理程序,就这样吧。虽然,我怎么知道哪个控件触发了点击?

编辑 2:请求的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:onClick="MyMethod"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="1">
<TextView
android:id="@+id/letter"
android:onClick="MyMethod"
android:layout_width="60dp"
android:layout_height="fill_parent"
/>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:onClick="MyMethod"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
android:id="@+id/firstname"
android:onClick="MyMethod"
android:layout_width="fill_parent"
android:layout_height="17dp" />
<TextView
android:id="@+id/longname"
android:onClick="MyMethod"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />

</LinearLayout>
<Button
android:text="Test"
android:onClick="OtherMethod"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:id="@+id/process"/>
</LinearLayout>

最佳答案

您可以通过在适配器内为 itemclicklistener 创建一个接口(interface)来实现此目的。然后你可以设置onItemClickListener来自您的MainActivity .

在你的 RecyclerViewAdapter 里面的某个地方您将需要以下内容:

private onRecyclerViewItemClickListener mItemClickListener;

public void setOnItemClickListener(onRecyclerViewItemClickListener mItemClickListener) {
this.mItemClickListener = mItemClickListener;
}

public interface onRecyclerViewItemClickListener {
void onItemClickListener(View view, int position);
}

然后在你的 ViewHolder里面(我已将其添加为适配器中的内部类),您可以将监听器应用于您希望用户单击的组件,如下所示:
class RecyclerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public ImageView imageview;

RecyclerViewHolder(View view) {
super(view);
this.imageview = (ImageView) view
.findViewById(R.id.image);
imageview.setOnClickListener(this);
}

@Override
public void onClick(View v) {
if (mItemClickListener != null) {
mItemClickListener.onItemClickListener(v, getAdapterPosition());
}
}
}

此示例显示 onClickListener应用于 ViewHolder 内的图像.
recyclerView.setAdapter(adapter);// set adapter on recyclerview
adapter.notifyDataSetChanged();// Notify the adapter
adapter.setOnItemClickListener(new RecyclerViewAdapter.onRecyclerViewItemClickListener() {
@Override
public void onItemClickListener(View view, int position) {
//perform click logic here (position is passed)
}
});

要实现此代码,您需要 setOnItemClickListener到您的适配器内部 MainActivity如上图所示。

编辑

因为 View正在传递到 OnItemClickListener ,您可以执行 switch监听器中的语句,以确保对正确的组件执行正确的逻辑。您需要做的就是从 MyMethod 中获取逻辑。函数并将其复制并粘贴到您希望将其应用于的组件。

例子:
recyclerView.setAdapter(adapter);// set adapter on recyclerview
adapter.notifyDataSetChanged();// Notify the adapter
adapter.setOnItemClickListener(new RecyclerViewAdapter.onRecyclerViewItemClickListener() {
@Override
public void onItemClickListener(View view, int position) {
Switch (view.getId()) {
case R.id.letter:
//logic for TextView with ID Letter here
break;
case R.id.firstname:
//logic for TextView with ID firstname here
break;
....
//the same can be applied to other components in Row_Layout.xml
}
}
});

您还需要更改 ViewHolder 中的某些内容。 .而不是应用 OnClickListenerImageView ,您需要像这样应用到整行:
 RecyclerViewHolder(View view) {
super(view);
this.imageview = (ImageView) view
.findViewById(R.id.image);
view.setOnClickListener(this);
}

编辑 2

解释:

因此,对于每个 RecyclerView .您需要三个组件, RecyclerView , RecyclerViewAdapterRecyclerViewHolder .这些定义了用户看到的实际组件 ( RecyclerView) 和该 View 中的项目。适配器是将所有东西拼凑在一起并实现逻辑的地方。 Bill Phillips 在文章 RecyclerView Part 1: Fundamentals For ListView Experts 中很好地解释了这些组件的来龙去脉。在大 Nerd 牧场。

但是为了进一步解释点击事件背后的逻辑,它基本上是利用 interfaceRecyclerViewAdapter 传递信息到 RecyclerViewHolder给您的 MainActivity .因此,如果您遵循 RecyclerView 的生命周期适配器,这将是有道理的。

适配器在您的 MainActivity 中初始化,然后将使用正在传递的信息调用适配器的构造函数。然后这些组件将通过 OnCreateViewHolder 传递到适配器中。方法。这本身会告诉适配器,这就是您希望列表的样子。然后需要单独初始化该布局中的组件,这就是 ViewHolder发挥作用。正如您所看到的,您将在 Activities 中初始化任何其他组件。 ,您在 ViewHolder 中执行相同操作但是因为 RecyclerViewAdapter膨胀 ViewHolder您可以愉快地在适配器中使用它们,如 Zeeshan Shabbir 所示。但是,对于这个示例,您希望多个组件将不同的逻辑应用于您的 MainActivity 中的每个单独的组件。类(class)。

这就是我们将点击监听器创建为全局变量的地方(因此它可以被 ViewHolderAdapter 访问)在这种情况下,适配器的工作是通过创建 Interface 来确保监听器存在。你可以通过初始化监听器。
 public interface onRecyclerViewItemClickListener {
void onItemClickListener(View view, int position);
}

在您定义了您希望接口(interface)保存的信息(例如组件及其位置)之后,您可以创建一个函数,适配器将调用该函数以应用您的 Activity 中的逻辑(与您调用 View.OnClickListener 的方式相同)但是通过创建 setOnItemClickListener , 你可以自定义它。
public void setOnItemClickListener(onRecyclerViewItemClickListener mItemClickListener) {
this.mItemClickListener = mItemClickListener;
}

那么这个函数需要 onRecyclerViewItemClickListener传递给它的变量,如您的 MainActivity 中所示. new RecyclerViewAdapter.onRecyclerViewItemClickListener()在这种情况下,它是您之前创建的接口(interface),其中需要实现其中的方法,因此
@Override
public void onItemClickListener(View view, int position) {
}

叫做。

所有 ViewHolder在这种情况下所做的是将信息(它的自身和位置的组件)传递到 onItemClickListener附加组件(在 onClick 函数内)以完成实际的点击功能。

如果您希望我无论如何更新解释,请告诉我。

关于android - RecyclerView - 获取 Activity 内部的位置,而不是 RecyclerView 适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41041153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com