天道酬勤,学无止境

RecyclerView OnItemclick 无法正常工作(RecyclerView OnItemclick not working properly)

问题

我有一个回收器视图,我正在其中实施 OnClicklistener。 基本上,我有一个名为actoradapter 的适配器类和一个viewholder 类MyViewHolder。我在viewholder 类中实现OnClickListener 以通过意图方法启动另一个活动。 我的基本数据位于一个名为 actor 的类中,该类具有三个变量name、country(均为 String)和一个 Id(UUID)。 我正在向我的适配器提供这些女演员的数据。下一个活动只是显示它检索的女演员的姓名,如 abc、def 等。 问题是点击后只显示一位女演员的名字。 例如,如果它显示 abc,那么每次点击它都会显示 abc。不知道为什么会发生这种情况,因为根据代码,我将 actorname 作为额外的。

public class actressadapter extends RecyclerView.Adapter <actressadapter.MyViewHolder> {
private List<Actress>al;
private  Actress actress,mActress;
public static final String str="shivam.panwar.actressdetails.actressadapter.str";


public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    public TextView naam, desh;

    public MyViewHolder(View view) {
        super(view);

        view.setOnClickListener(this);
        naam = (TextView) view.findViewById(R.id.name);
        desh= (TextView) view.findViewById(R.id.country);


    }
    @Override
    public void onClick(View v) {
        Toast.makeText(v.getContext(),"Clicked",Toast.LENGTH_SHORT).show();
    Intent intent=new Intent(v.getContext(),Actressview.class);

        intent.putExtra(str,actress.getName());
        v.getContext().startActivity(intent);
    }

    public void bindactress(Actress mActress) {
        naam.setText(mActress.getName());
        desh.setText(mActress.getCountry());
    }
}


public actressadapter(List<Actress> al) {
    this.al = al;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.actress_list_row, parent, false);


    return new MyViewHolder(itemView);


}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {


    actress =al.get(position);


    holder.bindactress(actress);
}



@Override
public int getItemCount() {
    return al.size();
}

}

如果需要有关代码的任何进一步帮助,请发表评论。

回答1

试试这种方式希望它有效......

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    actress =al.get(position);
    holder.bindactress(actress);
    holder.naam.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context,holder.naam.getText().toString(), Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(context,Actressview.class);
                    intent.putExtra(str,holder.naam.getText().toString());
                    context.startActivity(intent);
                }
            });

}
回答2

使用适配器类的getLayoutPosition()方法获取所选项目(位置)的最佳方法。

您必须更新代码以获得更好的结果。 用它替换您现有的代码。

public class actressadapter extends RecyclerView.Adapter <actressadapter.MyViewHolder> {
private List<Actress>al;
private  Actress actress,mActress;
private int itemPosition;  // change
public static final String str="shivam.panwar.actressdetails.actressadapter.str";


    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        public TextView naam, desh;

        public MyViewHolder(View view) {
            super(view);

            view.setOnClickListener(this);
            naam = (TextView) view.findViewById(R.id.name);
            desh= (TextView) view.findViewById(R.id.country);


        }
        @Override
        public void onClick(View v) {
            itemPosition = getLayoutPosition();   // change
            Toast.makeText(v.getContext(),"Clicked",Toast.LENGTH_SHORT).show();
            Intent intent=new Intent(v.getContext(),Actressview.class);

            intent.putExtra(str,al.get(itemPosition).getName());  // change
            v.getContext().startActivity(intent);
        }

        public void bindactress(Actress mActress) {
            naam.setText(mActress.getName());
            desh.setText(mActress.getCountry());
        }
    }


    public actressadapter(List<Actress> al) {
        this.al = al;
    }
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.actress_list_row, parent, false);


        return new MyViewHolder(itemView);


    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {


        actress =al.get(position);


        holder.bindactress(actress);
    }



    @Override
    public int getItemCount() {
        return al.size();
    }
}

希望它会起作用..

回答3

你的问题是你让actress成为 Adapte 的变量,它应该是 Holder 的变量。

要解决这个问题:

删除该行:

 private  Actress actress,mActress;

onBindViewHolder方法更改为:

holder.bindactress(al.get(position))

并用以下内容替换您的持有人类:

// holder HAVE TO be static. It's WRONG not doing it static
public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    TextView naam, desh;
    Actress actress;

    public MyViewHolder(View view) {
        super(view);
        view.setOnClickListener(this);
        naam = (TextView) view.findViewById(R.id.name);
        desh= (TextView) view.findViewById(R.id.country);

    }

    @Override
    public void onClick(View v) {
        Toast.makeText(v.getContext(),"Clicked",Toast.LENGTH_SHORT).show();
        Intent intent=new Intent(v.getContext(),Actressview.class);
        intent.putExtra(str,actress.getName());
        v.getContext().startActivity(intent);
    }

    public void bindactress(Actress mActress) {
        this.actress = mActress;
        naam.setText(mActress.getName());
        desh.setText(mActress.getCountry());
    }
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 获取点击的项目及其在RecyclerView中的位置(Get clicked item and its position in RecyclerView)
    问题 我用RecyclerView替换了ListView ,列表显示正常,但是我想知道如何获得被点击的项目及其位置,类似于我们在其中使用的方法OnItemClickListener.onItemClick(AdapterView parent,View v,int position,long id) ListView 。 感谢您的想法! 回答1 基于链接:为什么RecyclerView没有onItemClickListener()? 以及RecyclerView与Listview有何不同?还有@Duncan的一般想法,我在这里给出我的解决方案: 为从适配器到Activity / Fragment的传递消息定义一个接口RecyclerViewClickListener : public interface RecyclerViewClickListener { public void recyclerViewListClicked(View v, int position); } 在Activity / Fragment实现接口,并将侦听器传递给适配器: @Override public void recyclerViewListClicked(View v, int position){... ...} //set up adapter and pass clicked
  • Kotlin中的RecyclerView itemClickListener [关闭](RecyclerView itemClickListener in Kotlin [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想要改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。 1年前关闭。 改善这个问题 经过3年的Android使用经验,我正在Kotlin编写我的第一个应用程序。 只是对如何在Kotlin中将itemClickListener与RecyclerView结合使用感到困惑。 我已经尝试过特质(edit:now interface)方法,非常类似于Java public class MainActivity : ActionBarActivity() { protected override fun onCreate(savedInstanceState: Bundle?) { // set content view etc go above this line class itemClickListener : ItemClickListener { override fun onItemClick(view: View, position: Int) { Toast.makeText(this@MainActivity, "TEST: " + position, Toast.LENGTH_SHORT).show() } } val adapter = DrawerAdapter
  • L中的RecyclerView onItemClick效果(RecyclerView onItemClick effect in L)
    问题 也许以前有人问过这个问题,但是我找不到确切的答案。 我已经在我的L测试应用程序中将RecyclerView小部件实现为列表,当您单击列表中的项目时,我想获得“实质性效果”。 我实现了一个onClickListener我ViewHolder创建和设置属性 android:background="?android:attr/selectableItemBackground" 作为我的列表项布局(作为父项)的背景。 但是,这些都不起作用。 当我单击项目时,什么都不会发生。 没有影响,晕,物质,没有...请指出我在这里做错了什么... Thx 回答1 桑德拉的答案对我不起作用。 我在列表项布局中还需要一个属性: android:clickable="true" android:focusable="true" android:background="?android:attr/selectableItemBackground" 注意:如果在最后一行粘贴时遇到错误,则说明您的android应用设置为版本10或更低版本。 只需右键单击Android Studio中的错误并进行设置,这样它也将创建v11版本的版式。 然后,在原始布局中,确保删除 android:background="?android:attr/selectableItemBackground"` 这是因为android
  • 共享元素转换没有预期的行为(Shared element transition don't have the expected behaviour)
    问题 我实现了从 RecyclerView 中的图像到新 Fragment 中的图像之间的共享元素转换。 RecyclerView 托管在由 Activity 托管的片段中,而目标片段托管在另一个 Activity 中。 当我点击我的图像时,转换会像预期的那样发生,然后我会看到我的片段。 但是当我单击后退按钮时,转换试图将我的图像放在我的 RecyclerView 的第一个位置,而它当前显示的图像不一定是第一个。 从这种情况来看,我认为因为它是一个图像列表,我在 XML 中设置了一个过渡名称,也许当回去时,因为所有图像都具有相同的过渡名称,所以这个过程很混乱,只需获取给定的第一个图像名称。 所以也许我应该动态地给他们每个人一个不同的过渡名称。 我还为目标图像设置了相同的名称,并在每次选择新图像时重置它。 但它仍然无法正常工作。 任何人都可以帮助我吗? 这是我的 onItemClickListener 中的代码: mAdapter.setOnItemClickListener(new RssItemAdapter.OnItemCLickListener(){ @Override public void onItemClick(View view, int position) { final RssItem item = mAdapter.getItem(position)
  • 如何将Onclick侦听器添加到回收者视图(How to add Onclick listener to recycler view)
    问题 我首先开发了一个简单的记事本应用程序,我使用listView来显示所有注释。但是现在我正在使用RecyclerView。 当我使用列表视图时,我使用OnItemClickListener将数据传递给另一个活动以编辑笔记,现在我在Recylerview中感到困惑 对于listView我正在使用它 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { name = filenames.get(position).getName(); note = filenames.get(position).getShorttext(); Alert(); // this method is in main activity } });*/ public void Alert() { final AlertDialog dialog; View mview = getLayoutInflater().inflate(R.layout.dialog_pass,null); final EditText mEdittext =
  • 为什么RecyclerView没有onItemClickListener()?(Why doesn't RecyclerView have onItemClickListener()?)
    问题 我在浏览RecyclerView ,惊讶地发现RecyclerView没有onItemClickListener() 。 我有两个问题。 主要问题 我想知道为什么Google删除了onItemClickListener()吗? 是否存在性能问题或其他问题? 次要问题 我通过在RecyclerView.Adapter编写onClick解决了我的问题: public static class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener { public TextView txtViewTitle; public ImageView imgViewIcon; public ViewHolder(View itemLayoutView) { super(itemLayoutView); txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.item_title); imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.item_icon); } @Override public void onClick(View v) { } } 这样可以/有更好的方法吗?
  • RecyclerView onClick(RecyclerView onClick)
    问题 有没有人使用RecyclerView找到一种方法来设置一个onClickListener在项目RecyclerView ? 我想为每个项目的每个布局设置一个侦听器,但这似乎有点麻烦,我相信RecyclerView可以侦听onClick事件,但是我不太清楚。 回答1 由于API发生了根本性的变化,如果您要为每个项目创建一个OnClickListener ,这也不会令我感到惊讶。 不过,这并不是一件麻烦事。 在实现RecyclerView.Adapter<MyViewHolder> ,您应该具有: private final OnClickListener mOnClickListener = new MyOnClickListener(); @Override public MyViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) { View view = LayoutInflater.from(mContext).inflate(R.layout.myview, parent, false); view.setOnClickListener(mOnClickListener); return new MyViewHolder(view); } onClick方法:
  • RecyclerView OnItemclick not working properly
    I have a recycler view and I am implementing OnClicklistener inside it. Basically , I have an adapter class called actressadapter and a viewholder class MyViewHolder.I am implementing OnClickListener inside viewholder class to initiate another activity via intent method. My basic data is inside a class called actress which has three variables name,country(both String) and an Id(UUID). I am providing this data that is of actresses to my adapter.Next activity is just displaying the name of actress like abc ,def etc that it retrieves . The fault is that it shows name of only one actress after
  • 单击侦听器上的 RecyclerView 不起作用(RecyclerView on Click Listener Not working)
    问题 当我想单击回收器视图时,它应该打开另一个正在获取的活动数据,但问题是当我单击回收视图时,它什么也不显示。 我试过 RecyclerView.OnItemTouchListener。 但还没有成功。 你能弄清楚是什么问题吗,我哪里出错了 public class RestaurantAdapter extends RecyclerView.Adapter<RestaurantAdapter.MyViewHolder> { List<AllRestaurant> restaurantList; @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.listitem, parent, false); return new MyViewHolder(itemView); } public class MyViewHolder extends RecyclerView.ViewHolder { //public TextView long1, medium, small; TextView t1,t2,t3,t4,t5
  • RecyclerView onClickListener [重复](RecyclerView onClickListener [duplicate])
    问题 这个问题已经在这里有了答案: RecyclerView onClick (48个答案) 3年前关闭。 因此,经过5个月的网络开发,我需要重新使用android,但是我发现我的一些旧代码不再起作用。 我有一个带有数据适配器的RecyclerView,但该项目的onClickListener没有任何响应。 这是我的代码如下所示: public class ProjectAdapter extends RecyclerView.Adapter<ProjectAdapter.ViewHolder> { private List<Project> itemsData; OnItemClickListener mItemClickListener; public ProjectAdapter(List<Project> itemsData) { this.itemsData = itemsData; } // Create new views (invoked by the layout manager) @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a new views View itemLayoutView = LayoutInflater
  • RecyclerView onClickListener [duplicate]
    This question already has answers here: RecyclerView onClick (48 answers) Closed 3 years ago. So after 5 months of webdevelopment I needed to get back into android but I noticed some of my old code isn't working anymore. I have a RecyclerView with a adapter for the data but the onClickListener for the items doesn't respond to anything. This is what my code looks like: public class ProjectAdapter extends RecyclerView.Adapter<ProjectAdapter.ViewHolder> { private List<Project> itemsData; OnItemClickListener mItemClickListener; public ProjectAdapter(List<Project> itemsData) { this.itemsData =
  • 如何获得在RecyclerView中选择的位置?(How do I get the position selected in a RecyclerView?)
    问题 我正在尝试使用支持库的recyclerview和卡。 我对卡片有一个recyclerview的看法。 每张卡的右上角都有一个“ x”图标以将其删除: 卡片xml list_item.xml : <?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="5dp"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/taskDesc" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:textSize="40sp"
  • RecyclerView项目单击正确的监听器(RecyclerView Item Click Listener the Right Way)
    问题 我使用RecyclerView适配器在活动内显示数据,我想在活动内实现onClickListener ,目前,我像往常一样在适配器内设置onClickListener ,效果很好。 public void onBindViewHolder(MyHolder holder, final int position) { final Listdata data = listdata.get(position); holder.vname.setText(data.getName()); holder.vname.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(activity, "clicked on " +position, Toast.LENGTH_SHORT).show(); } }); } 但是我想在活动中实现它,所以我有更大的控制权。 这不符合我的目的。 我认为这对我们很多人都是有用的。 回答1 您需要在此处查看本教程,以更好地了解如何实现所需的行为。 如果从您的活动中处理onClickListener ,则需要基于带有接口的回调实现。 将接口从活动传递到适配器,然后在单击某些项目时从适配器调用回调函数。
  • RecyclerView onItemClick effect in L
    Maybe this question has been asked before, but I couldn't find a precise answer. I have implemented the RecyclerView widget as a list in my L test application and I want to get the 'material effect' when you click on an item form the list. I implemented an onClickListener in my ViewHolder creation and set the attribute android:background="?android:attr/selectableItemBackground" as a background to my list item layout (to the parent). But none of this worked. When I click on the items NOTHING happens'. There is no effect, holo, material, none... Please point out if I am doing something wrong
  • 将RecyclerView与GridLayoutManager结合使用的简单Android网格示例(如旧的GridView)(Simple Android grid example using RecyclerView with GridLayoutManager (like the old GridView))
    问题 我知道RecyclerView取代了旧的ListView和GridView 。 我正在寻找一个非常基本的示例,该示例显示了使用RecyclerView的最小网格设置。 我不是在寻找冗长的教程风格说明,而只是一个最小的示例。 我认为模仿旧版GridView的最简单的网格将包含以下功能: 每行多个单元格每个单元格中的单个视图响应点击事件 回答1 简短答案 对于那些已经熟悉设置RecyclerView来创建列表的人来说,好消息是创建网格的过程基本相同。 设置RecyclerView时,只需使用GridLayoutManager而不是LinearLayoutManager 。 recyclerView.setLayoutManager(new GridLayoutManager(this, numberOfColumns)); 如果您需要更多帮助,请查看以下示例。 完整的例子 以下是一个最小示例,如下图所示。 从一个空的活动开始。 您将执行以下任务以添加RecyclerView网格。 您需要做的就是将代码复制并粘贴到每个部分中。 以后,您可以自定义它以满足您的需求。 将依赖项添加到gradle 为活动和网格单元添加xml布局文件制作RecyclerView适配器在您的活动中初始化RecyclerView 更新Gradle依赖项 确保以下依赖项位于您的应用gradle.build文件中
  • Youtube 视频未在 RecyclerView 中显示(Youtube Video is not Displaying in RecyclerView)
    问题 我面临的问题是 youtube 视频不显示只有最后一个正在播放,而且当我滚动视频时也会消失。 我想要的是每个视频都应该显示,每个视频都是不同的。 public class MyRecyclerViewAdapter extends Adapter<MyRecyclerViewAdapter .DataObjectHolder> { private static String LOG_TAG = "MyRecyclerViewAdapter"; private ArrayList<DataObject> mDataset; private static MyClickListener myClickListener; private static final int RECOVERY_DIALOG_REQUEST = 10; public static String key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; Context ctx; View view; public static class DataObjectHolder extends ViewHolder implements View .OnClickListener { YouTubePlayerView youTubeView; public
  • 使用一些 `put extra` onClick of a recyclerView Item 返回上一个 Activity(Go back to previous Activity with some `put extra` onClick of a recyclerView Item)
    问题 我想在 Recycler 视图中单击 Item 时传递数据先前的活动,并将其显示在 Edit Text 上。 这是我用来将数据从列表视图传递到上一个活动的代码 我想用 Recyclerview 做同样的事情 //调用第二个活动 public static final int REQUEST_CODE = 100; Intent dateintent = new Intent(MainActivity.this, SecondActivity.class); startActivityForResult(dateintent, REQUEST_CODE); //点击列表视图将数据传回上一个活动 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { TextView txt = (TextView) view.findViewById(R.id.textView); String str = txt.getText().toString(); Intent intent = new Intent()
  • 点击 RecyclerView 空白空间(click through RecyclerView empty space)
    问题 我有一个布局,其中 RecyclerView 位于带有几个按钮的另一个布局之上。 第一个回收项是一个带有大上边距的标题,以在其上方创建一个空白空间。 现在我希望点击可以通过那个开放空间,滑动也应该滚动回收器。 视图位于一个简单的框架中。 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <package.FeedBackgroundView android:id="@+id/feed_background" android:layout_width="match_parent" android:layout_height="wrap_content"/> <android.support.v7.widget.RecyclerView android:id="@+id/recycler" android:layout_width="match_parent" android:layout_height="match_parent" android
  • 从 RecyclerView 中的 ViewHolder 调用活动?(Calling activity from ViewHolder in RecyclerView?)
    问题 我有一个 RecyclerView 正在加载我的字符串数组的内容,它工作正常,但是我想根据他们按下的视图打开一个新活动。 我所做的是创建了一个名为 classes 的数组,如下所示: <array name="classes"> <item>ClassOne</item> <item>ClassTwo</item> <item>ClassThree</item> <item>ClassFour</item> </array> 这些存储在一个数组中,并传递到下面的 MainActivityList 适配器: String[] classes = resource.getStringArray(R.array.classes); MainActivityList adapter = new MainActivityList(titles,content, images, classes); recyclerView.setAdapter(adapter); 我已经设法将 OnClickListener 添加到 ViewHolder 并将分配给每个视图的类输出到日志,但是我无法弄清楚或开始工作,如何启动另一个活动。 例如,类名将类似于 ClassOne.class public class MainActivityList extends RecyclerView.Adapter
  • RecyclerView OnClick 不起作用(RecyclerView OnClick not working)
    问题 我在片段中制作了一个水平回收器视图。 现在,当我点击任何项目时,我没有看到点击监听器在工作。 这是我的 Adapter 类代码: public class FeaturedProductsAdapter extends RecyclerView.Adapter<FeaturedProductsAdapter.CustomViewHolder> { private List<FeaturedProductInfo> feedItemList; private Context mContext; public FeaturedProductsAdapter(Context context, List<FeaturedProductInfo> feedItemList) { this.feedItemList = feedItemList; this.mContext = context; } public class CustomViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { protected ImageView imageView; protected TextView textView,priceView; private Context context; public