- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
现在是我处理 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())
MainActivity
因为我正在使用该 Activity 独有的东西。
MainActivity
以简单的方式。
RecyclerView
和一个适配器。适配器链接到我的
row_layout
.这个
row_layout
xml 有一个根
LinearLayout
.里面有一个
TextView
, 另一个
LinearLayout
(有两个
TextViews
)和一个
Button
(为简单起见)。我不想为处理
RecylerView
上的点击而受苦就像我对
ListView
所做的那样.所以,我决定添加一个
android:onclick
对于每个控件,然后链接
TextView
和
LinearLayout
到单个方法并链接
Button
(以及 future 的
Button
s)到他们独特的方法。我缺少的是我希望能够在我的
MainActivity
上告诉每个接收方法的位置。 .如果我必须链接来自适配器的所有内容并进入
MainActivity
到单个 onclick 处理程序,就这样吧。虽然,我怎么知道哪个控件触发了点击?
<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
中的某些内容。 .而不是应用
OnClickListener
到
ImageView
,您需要像这样应用到整行:
RecyclerViewHolder(View view) {
super(view);
this.imageview = (ImageView) view
.findViewById(R.id.image);
view.setOnClickListener(this);
}
RecyclerView
.您需要三个组件,
RecyclerView
,
RecyclerViewAdapter
和
RecyclerViewHolder
.这些定义了用户看到的实际组件 (
RecyclerView
) 和该 View 中的项目。适配器是将所有东西拼凑在一起并实现逻辑的地方。 Bill Phillips 在文章
RecyclerView
Part 1: Fundamentals For ListView
Experts 中很好地解释了这些组件的来龙去脉。在大 Nerd 牧场。
RecyclerViewAdapter
传递信息到
RecyclerViewHolder
给您的
MainActivity
.因此,如果您遵循
RecyclerView
的生命周期适配器,这将是有道理的。
MainActivity
中初始化,然后将使用正在传递的信息调用适配器的构造函数。然后这些组件将通过
OnCreateViewHolder
传递到适配器中。方法。这本身会告诉适配器,这就是您希望列表的样子。然后需要单独初始化该布局中的组件,这就是
ViewHolder
发挥作用。正如您所看到的,您将在
Activities
中初始化任何其他组件。 ,您在
ViewHolder
中执行相同操作但是因为
RecyclerViewAdapter
膨胀
ViewHolder
您可以愉快地在适配器中使用它们,如 Zeeshan Shabbir 所示。但是,对于这个示例,您希望多个组件将不同的逻辑应用于您的
MainActivity
中的每个单独的组件。类(class)。
ViewHolder
和
Adapter
访问)在这种情况下,适配器的工作是通过创建
Interface
来确保监听器存在。你可以通过初始化监听器。
public interface onRecyclerViewItemClickListener {
void onItemClickListener(View view, int position);
}
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/
我在另一个 RecyclerView(parentRecyclerView) 中实现了 RecyclerView(childRecyclerView),图片说明了所有的实现: 我想编写一个 espre
我正在构建一个应用程序,它使用ViewPager2在页面之间水平滚动,每个页面都有一个垂直滚动的内容RecyclerView,其中每个列表的第一个位置都有一行水平滚动小部件,例如附加到寻呼机指示器类型
我正在尝试实现一个水平的 recyclerview 并且 recyclerview 的每个项目都将是一个具有网格布局的垂直 recyclerview。我面临的问题是,当我尝试垂直滚动子 recycle
我使用显示条目列表的 RecyclerView。每个条目都托管另一个 RecyclerView,它是一个图像列表。 我现在想让这个嵌套的 RecyclerView 可点击,而不是它的项目,而是整个 V
我正在尝试将手机中的图像加载到我的回收 View 中。 到目前为止,我已经创建了一个 recyclerview.adapter 和一个 gridlayoutmanager,并将它们附加到我的 recy
我需要一个可扩展 View ,其中父/可扩展标题将具有文本和下拉箭头。每个此类标题的子项应该是在网格结构中具有多个项目的 View 。 (有点像带有 GridLayoutManager 的回收器 Vi
我正在使用显示不同类别列表的 RecyclerView。每行项目还包含 RecyclerView 以显示类别项目列表。父级 RecyclerView 由垂直 LinearLayoutManager 填
我正在更新一个旧的 Android 项目,现在我从 RecyclerView 中反复收到这条日志语句: W/RecyclerView:RecyclerView 不支持滚动到绝对位置。改为使用 scro
在我的 Adapter 中,我调用 LayoutManager.ChildAt(position) 来获取 itemview,但是我得到的 View 不是匹配的 itemview,当我调用 notif
我正在从 ListView 迁移到 RecyclerView,但是在 SQLite 中输入一些数据后,我的列表没有使用 notifyDataSetChanged() 更新;所以我总是要调用setAda
我正在用 Google Now Cards 的风格创建一组 5 张卡片。我首先关注的是总体布局。 我正在使用 CardView 和 RecyclerView ,我想要实现的是这样的: 这是我的 Car
在我的应用程序中,我有一个 RecyclerView,其中包含一个简单的项目 View ,每行包含一个 TextView 和一个 Spinner。 用户从操作栏中单击“保存”后,我需要遍历所有项目并获
我正在尝试检查 RecyclerView 中是否可以看到某些特定项目;但我无法实现。请帮助我确定我的项目是否在 RecyclerView 中完全可见。 mrecylerView.addOnScroll
我有一个提要片段,它的主要元素是帖子的 RecyclerView。 我正在使用 Lisa Wray 的 Groupie 库管理回收站 https://github.com/lisawray/group
我有这两个类似的行为回收器 View 适配器,它们之间的唯一区别是 onclick 方法和传递给它们的对象。所以,我正在考虑将类 B 设计为从回收器 View 适配器继承,这样我就可以更改构造函数来执
这很奇怪。我对这个问题感到沮丧。我将数据保存在 ArrayList 中。当我将数据放在 RecyclerView 上时。数据未显示在列表中。这是我的代码 listOrder.forEach { ord
编辑我通过使用 CoordinatorLayout 和 AppBarLayout 作为 header 和 TabLayout 的包装解决了这个问题。本来应该很明显,但是哦,好吧。 原始问题:我有一个设
我有一个回收 View 。我想从其适配器类更新回收器 View 。我尝试了 notiftDataSetChanged( ) 但它只适用于主类。下面是 recyclerview 适配器类的代码。 pac
我正在使用具有不同 viewholders 的 recyclerview(具有垂直 LinearLayout),其中一个有另一个 RecyclerView(带有水平 LL)。在第二个 recycler
我想创建一个与 Google Play Store 或 Netflix App 类似的布局,其中在单个 RecyclerView 中基本上有多个水平 RecyclerView。如果这不是他们做事的方式
我是一名优秀的程序员,十分优秀!