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,因为我正在使用该活动独有的东西.
TL; DR我想以简单的方式将点击的行的位置发送到我的MainActivity.
编辑:我为这个混乱道歉,因为我的主题不是很彻底.我有一个RecyclerVIEw和一个适配器.适配器链接到我的row_layout.这个row_layout xml有一个根linearLayout.里面有一个TextVIEw,另一个linearLayout(有两个TextVIEws)和一个button(为简单起见).我不想像处理ListVIEw那样处理RecylerVIEw上的点击.因此,我决定为每个控件添加一个androID:onclick,然后将TextVIEw和linearLayout链接到一个方法,并将button(和将来的buttons)链接到它们的独特方法.我缺少的是我希望能够在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创建一个接口来实现此目的,然后您可以从MainActivity设置onItemClickListener.
在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); }
编辑2
说明:
所以,每个RecyclerVIEw.您需要三个组件,RecyclerVIEw,RecyclerVIEwAdapter和RecyclerVIEwHolder.这些是定义用户看到的实际组件(RecyclerVIEw)和该视图中的项目的内容.适配器是将所有内容拼凑在一起并实现逻辑的地方. Bill Phillips在Big Nerd Ranch上发表了第RecyclerView
Part 1: Fundamentals For ListView
Experts条,很好地解释了这些组件的细节.
但为了进一步解释点击事件背后的逻辑,它基本上利用interface将信息从RecyclerVIEwAdapter传递到RecyclerVIEwHolder到MainActivity.因此,如果您遵循RecyclerVIEw适配器的生命周期,它将是有意义的.
适配器在MainActivity中初始化,然后将调用适配器的构造函数并传递信息.然后,组件将通过OnCreateVIEwHolder方法传递到适配器.这本身告诉适配器,这就是你希望列表的样子.然后需要单独初始化该布局中的组件,这就是VIEwHolder发挥作用的地方.正如您在活动中初始化的任何其他组件一样,您可以在VIEwHolder中执行相同 *** 作,但由于RecyclerVIEwAdapter会使VIEwHolder膨胀,您可以在适配器中愉快地使用它们,如Zeeshan Shabbir所示.但是,对于此示例,您希望多个组件将各种逻辑应用于MainActivity类中的每个组件.
这就是我们将click侦听器创建为全局变量的地方(因此它可以被VIEwHolder和Adapter访问)在这种情况下,适配器的工作是通过创建一个可以初始化侦听器的接口来确保侦听器存在.
public interface onRecyclerVIEwItemClickListener { voID onItemClickListener(VIEw vIEw,int position); }
在定义了您希望接口保持的信息(EG组件及其位置)之后,您可以创建一个函数,适配器将调用该函数来应用您的Activity中的逻辑(与您调用VIEw的方式相同). OnClickListener)但是通过创建setonItemClickListener,您可以自定义它.
public voID setonItemClickListener(onRecyclerVIEwItemClickListener mItemClickListener) { this.mItemClickListener = mItemClickListener; }
然后,此函数需要传递给它的onRecyclerVIEwItemClickListener变量,如MainActivity中所示.新的RecyclerVIEwAdapter.onRecyclerVIEwItemClickListener()在这种情况下,它是您之前使用内部方法创建的接口,因此需要实现
@OverrIDe public voID onItemClickListener(VIEw vIEw,int position) { }
叫做.
在这种情况下,VIEwHolder所做的就是将信息(它自己的组件和位置)传递到onItemClickListener中,并附加组件(在onClick函数内)以完成实际的点击功能.
如果您希望我以任何方式更新说明,请告诉我.
总结以上是内存溢出为你收集整理的android – RecyclerView – 在Activity里面获取Position而不是RecyclerViewAdapter全部内容,希望文章能够帮你解决android – RecyclerView – 在Activity里面获取Position而不是RecyclerViewAdapter所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)