iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0
Mobile Development

Android Studio 30天學習系列 第 12

Android Studio 30天學習-DAY12_RecyclerView(二)-點擊事件及Adapter跳轉事件

  • 分享至 

  • xImage
  •  

點擊事件及Adapter跳轉事件

今天來做recyclerview的點擊事件,昨天是建立出RecyclerView列表,今天來做點擊之後的跳轉頁面事件,以及判斷點擊的RecyclerView欄位是哪一欄的資料。
前面部分與昨天那篇相同,只需要在onBindViewHolder裡面新增點擊事件就可以了。

程式碼

下面就是點擊事件的建立寫法,會發現與一般在Activity的點擊事件不同,這是在Adapter建立的點擊事件,因為沒有指定View所以不知道是在哪裡,因此不能直接使用原本的點擊事件寫法。

這邊就需要我們在onBindViewHolder裡面建立,在我們建立完成之後他有一個holder的變數可以用,而這個型態是ListAdapter.ViewHolder,也就是前面已經建立好的ViewHolder

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //執行事件
            }
        });
  • 跳轉頁面
        holder.itemView.setOnClickListener (new View.OnClickListener () {
            @Override
            public void onClick (View view) {
                Intent intent = new Intent ();
                intent.setClass (view.getContext (),MainActivity2.class);
                view.getContext ().startActivity (intent);
            }
        });
  • 跳轉事件並傳送資料
    這個做法會用到Bundle,將畫面上的主要顯示的資料傳到下一個頁面上顯示,一樣在這之前要先定義ShopIDnum的型態在ViewHolder中,我是使用String型態進行設定。
    • 在Adapter的onBindViewHolder裡面的點擊跳轉並傳送資料。
        holder.itemView.setOnClickListener (new View.OnClickListener () {
            @Override
            public void onClick (View view) {


                Bundle bundle =new Bundle ();
                Intent intent = new Intent ();

                holder.ShopIDnum = holder.tvname.getText ().toString ();

                bundle.putString ("Shop_IDnum",holder.ShopIDnum);
                intent.putExtras (bundle);
                intent.setClass (view.getContext (),MainActivity2.class);


                view.getContext ().startActivity (intent);
            }
        });
  • 進到畫面2的Java檔案撰寫接收資料
public class MainActivity2 extends AppCompatActivity {
    String shopIDnum;
    TextView shopID;

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

        shopID = findViewById (R.id.shopIDnum);

        //接收的撰寫方式
        Bundle bundle = getIntent ().getExtras ();
        //將自己定義的Key放入就可以將資料放入此頁所定義的String變數裡面存放。
        shopIDnum = bundle.getString ("Shop_IDnum");
        //直接強制寫入並更改成對應資料。
        shopID.setText (shopIDnum);
    }
}
  • 附圖:
    點擊對應欄位所代表的資料,就會顯示所點擊欄位的資料。(使用橫向截圖以方便版面檢視)

  • 會這麼做的原因是想測試自己所點擊的RecyclerView欄位是哪一個欄位。

Adapter程式碼

package com.example.recyclerview002;

import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;

public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder> {
    ArrayList<HashMap<String ,String>> arrayList = new ArrayList<>();


    class ViewHolder extends RecyclerView.ViewHolder{

        private TextView tvname,tvdate,tvtime,tvrewardpoint;
        private String ShopIDnum;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            tvname = itemView.findViewById(R.id.textView);
            tvdate = itemView.findViewById(R.id.textView2);
            tvtime = itemView.findViewById(R.id.textView3);
            tvrewardpoint = itemView.findViewById(R.id.textView4);
        }

        public void itemView(HashMap<String, String> stringStringHashMap) {
        }
    }


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

    }

    @Override
    public void onBindViewHolder(@NonNull ListAdapter.ViewHolder holder, int position) {
        holder.tvname.setText(arrayList.get(position).get("name_infomation"));
        holder.tvdate.setText("YYYY/MM/DD");
        holder.tvtime.setText("hh/mm");
        holder.tvrewardpoint.setText(arrayList.get(position).get("rewardpoint_infomation"));

        holder.itemView.setOnClickListener (new View.OnClickListener () {
            @Override
            public void onClick (View view) {


                Bundle bundle =new Bundle ();
                Intent intent = new Intent ();

                holder.ShopIDnum = holder.tvname.getText ().toString ();

                bundle.putString ("Shop_IDnum",holder.ShopIDnum);
                intent.putExtras (bundle);
                intent.setClass (view.getContext (),MainActivity2.class);


                view.getContext ().startActivity (intent);
            }
        });

    }

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

    public void makedata(){
        for (int i = 0;i<100;i++){
            HashMap<String,String> hashMap = new HashMap<>();
            hashMap.put("name_infomation","商店代號:"+String.format("%02d",i+1));
            hashMap.put("rewardpoint_infomation",String.format ("%02d",i*2));

            arrayList.add(hashMap);
        }
    }
}

以上是RecyclerView點擊事件以及夾帶資料跳轉頁面的學習。


上一篇
Android Studio 30天學習-DAY11_RecyclerView01
下一篇
Android Studio 30天學習-DAY13_Fragment結合Recyclerview
系列文
Android Studio 30天學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言