android - 在 RecyclerView 项目上添加多个 onClickListener

标签 android android-recyclerview onclicklistener

我在回收站 View 中的 itemView 上添加了一个新 Activity ,但我想在单个项目上添加多个 Activity 。这些教程对 Button 来说非常好,但我不知道如何在 itemview 上实现。
MainActivity中调用的recyclerview如下;

private String[] channelnames={"PTC Punjabi","Chakde TV","T-Series Punjabi", "9X Tashan", "Zee Punjabi" };
    private int[] channelimages={R.drawable.ptcpunjabi, R.drawable.chakde, R.drawable.tseries, R.drawable.ninex, R.drawable.zeepunjabi};
    private List<channel> channelList=new ArrayList<>();

 thirdrecyclerView=findViewById(R.id.third_recycler_view);
        thirdrecyclerView.setHasFixedSize(true);
        channelList=new ArrayList<>();
        LinearLayoutManager thirdlinearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
        thirdrecyclerView.setLayoutManager(thirdlinearLayoutManager);
        for (int i=0;i < channelnames.length;i++){
            channel channel=new channel(channelnames[i],channelimages[i]);
            channelList.add(channel);
        }
适配器和 View 持有者类定义为;
public class channeladpater extends RecyclerView.Adapter<channeladpater.Channelviewholder> {
    private List<channel> channelList;
    Context ctx;

    public channeladpater(List<channel> channelList) {
        this.channelList = channelList;
        this.ctx=ctx;
    }

    @NonNull
    @Override
    public Channelviewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.card_view,parent,false);
        return new Channelviewholder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull Channelviewholder holder, int position)
    {
        channel channel=channelList.get(position);
        holder.channelname.setText(channel.getChannelname());
        holder.channelimage.setImageResource(channel.getChannelimage());

        holder.setItemClickListener(new ItemClickListener() {
            @Override
            public void onItemClickListener(View v, int position) {
                Intent intent=new Intent(ctx, MainActivity2.class);
                ctx.startActivity(intent);

            }
        });

    }

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

    public static class Channelviewholder extends RecyclerView.ViewHolder implements View.OnClickListener{
        public TextView channelname;
        public CircleImageView channelimage;
        ItemClickListener itemClickListener;

        Channelviewholder(@NonNull View itemView) {
            super(itemView);
           this.channelname=itemView.findViewById(R.id.profile_name);
            this.channelimage=itemView.findViewById(R.id.profile_image);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {

            this.itemClickListener.onItemClickListener(v,getLayoutPosition());


        }
        public void setItemClickListener(ItemClickListener ic){
            this.itemClickListener=ic;
        }
    }
}
在这里,我想将第一个图像或 TextView (PTC punjabi/R.drawable.ptcpunjabi)分配给 MainActivity 2,将第二个 TextView 和 ImageView (Chakde Tv/R.drawable.chakde)分配给 MainActivity 3,依此类推。当单击整张卡片时,如何调用文本或 ImageView 组合到下一个 Activity 开始。
MainActivity 2 如下;
public class MainActivity2 extends AppCompatActivity {

        RecyclerView recyclerView;
        ArrayList<VideoDetails> videoDetailsoArrayList;

        Intent intent=getIntent();

        String API_Key = "  ";
        String url="https://www.googleapis.com/youtube/v3/search?part=snippet&channelId="+channelID+"&maxResults=50&sort=date&key=[API_KEY]";
        com.currentmedia.punjabinews.adapter adapter;
        Context ctx;


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main2);

            recyclerView=findViewById(R.id.listView);
            videoDetailsoArrayList= new ArrayList<>();
            adapter=new adapter(MainActivity2.this,videoDetailsoArrayList);

            displayVideos();

        }


        private void displayVideos ()
        {
            RequestQueue requestQueue= Volley.newRequestQueue(this);
            StringRequest stringRequest=new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {


                @Override
                public void onResponse(String response) {
                    try {
                        JSONObject jsonObject = new JSONObject(response);
                        JSONArray jsonArray = jsonObject.getJSONArray("items");
                        for (int i = 0; i < jsonArray.length(); i++) {
                            JSONObject jsonObject1 = jsonArray.getJSONObject(i);
                            if (jsonObject1.has("id")){
                                JSONObject jsonVideoId=jsonObject1.getJSONObject("id");
                                if (jsonVideoId.has("kind")){
                                    if(jsonVideoId.getString("kind").equals("youtube#video")){
                                        JSONObject jsonObjectSnippet = jsonObject1.getJSONObject("snippet");
                                        JSONObject jsonObjectDefault=jsonObjectSnippet.getJSONObject("thumbnails").getJSONObject("medium");

                                        String video_id=jsonVideoId.getString("videoId");

                                        VideoDetails vd=new VideoDetails();

                                        vd.setVideoId(video_id);
                                        vd.setTitle(jsonObjectSnippet.getString("title"));
                                        vd.setDescription(jsonObjectSnippet.getString("description"));
                                        vd.setUrl(jsonObjectDefault.getString("url"));

                                        videoDetailsoArrayList.add(vd);
                                    }
                                    //  recyclerView.setAdapter(adapter);
                                    // adapter.notifyDataSetChanged();
                                }
                            }
                        }
                    }catch (JSONException e) {
                        e.printStackTrace();
                    }

                    recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
                    adapter= new adapter(getApplicationContext(),videoDetailsoArrayList);
                    recyclerView.setAdapter(adapter);
                }

            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(getApplicationContext(),error.getMessage(), LENGTH_LONG).show();
                }
            });
            requestQueue.add(stringRequest);
        }
在字符串 url 中,我想添加 channel ID 获取 的列表 channel 名 , 避免添加多个 Activity 。
PTC punjabi
UCHJW1_0oPzYZl89wX_jhrgA

Chakde Tv
UCaT-WGdJLyEDnxZPAKRTbqQ

T-series punjabi
UCJMSoNjSKRARSIJM3GymRjQ

9x tashan
UCrET5fR2NAUTO2Xp12G0l8A

zee punjabi
UCYF_LfBBxkFBEgaSCNrqW3w
上面提到的是我要分配给它们的 channel ID 列表,这样当从 MAin Activity 中选择每个图像时,单独的 channel Activity 就会开始。

最佳答案

如果列表中有 10 个项目,则无需为每个项目创建 10 个 Activity 。
您只需要一个相同的 Activity 来显示 MainActivity 列表中的详细信息。
当您按下列表中的项目时,您需要传递它的position和数据( channel 在你的情况下)到 SecondActivity 使用 Intents .
因此,让我们进行这些更改。
在您的适配器类中:
您已经设置了监听器,但请确保您正在传递数据。

        holder.setItemClickListener(new ItemClickListener() {
            @Override
            public void onItemClickListener(View v, int position) {
                Intent intent = new Intent(ctx, MainActivity2.class);
                // Using intent pass your data to MainActivity2 class
                intent.putExtra("Intent to MainActivity2", channel);
                ctx.startActivity(intent);
            }
        });
MainActivity2 类:
现在您必须从以前的 Activity 中接收数据。
在您的 onCreate()在扩展布局之后和设置任何 View 之前的 Activity 。
Channel channel = getIntent().getParcelableExtra("Intent to MainActivity2");
从上面的代码中,您正在获取此 Intent 所接收到的数据,您也可能从任何 Activity 中接收到数据,因此具体来自您使用 String 引用的 Activity 里面 getParcelableExtra()现在获取数据后,以这种方式调用它的属性
yourTextView.setText(channel.channelname)
而已。现在您可以看到单击先前 Activity 列表中的每个项目,不再需要额外的 Activity 。
供您引用,您可以查看 project遵循类似的方法。

关于android - 在 RecyclerView 项目上添加多个 onClickListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63947092/

相关文章:

android - Recyclerview - 更新 View 持有者中的 View 而不修改其所有 View 的最佳实践

java - 如何在 Android Studio 中从 Onclick() 获取字符串值到 onSaveInstanceState()

android - 有没有办法将 OnClickListener 重置为其默认的 Android 实现?

Android On Focus Listener 和 On ImageView 上的 On Click Listener

android - 如何更改回收站 View 中项目的位置

android - 如何打印整个 WebView(可滚动)?

php - 通过 Android Studio 使用 MySQL 数据库登录应用程序

android - 如何使用bundletool从AAB生成APK(不是APKS)?

java - 用 Espresso 测试 recyclerView,如何执行点击或断言

Android 房间数据库错误 : Unused parameter: days in @Query function