亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 FirebaseRecyclerAdapter 獲取文檔 ID 并將值傳遞到新頁面

從 FirebaseRecyclerAdapter 獲取文檔 ID 并將值傳遞到新頁面

慕勒3428872 2022-06-08 16:42:00
我有一個顯示文檔列表的 FirestoreRecyclerAdapter。我在列表中的每個項目旁邊都有一個按鈕。單擊此按鈕時,我想獲取所選項目的唯一 ID,然后將用戶帶到顯示該項目的個人詳細信息的頁面。本質上,我想將單擊的文檔的 ID 傳遞到下一頁。但是,我的按鈕在單擊時會引發空指針異常。這段代碼來自我的 ClubAdapter 類。public class ClubAdapter1 extends FirestoreRecyclerAdapter<Club, ClubAdapter1.ClubHolder> {    private String clubId;    private Context context;    public ClubAdapter1(@NonNull FirestoreRecyclerOptions<Club> options) {        super(options);    }    @Override    protected void onBindViewHolder(@NonNull ClubHolder holder, int position, @NonNull Club model) {        holder.lblName.setText(model.getClubName());        //getting the ID of the particular event clicked        clubId = getSnapshots().getSnapshot(position).getId();        holder.btnDetails.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent i = new Intent(context, ViewSingleClub.class);                i.putExtra("id", clubId);                context.startActivity(i);            }        });    }    @NonNull    @Override    public ClubHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.clublist_layout, parent, false);        return new ClubHolder(v);    }    class ClubHolder extends RecyclerView.ViewHolder {        TextView lblName;        Button btnDetails;        public ClubHolder(@NonNull View itemView) {            super(itemView);            lblName = itemView.findViewById(R.id.lblName);            btnDetails = itemView.findViewById(R.id.btnDetails);        }    }}我不斷收到錯誤, Intent i = new Intent(context, ViewSingleClub.class); 我認為這可能與我的上下文變量引用自身有關,但也不確定我是否正確獲取了 ID。有人能幫忙嗎?
查看完整描述

2 回答

?
白衣染霜花

TA貢獻1796條經驗 獲得超10個贊

這是因為您正在分配“自身的上下文”。從初始化適配器的類中傳遞上下文。


假設我有名為“ClubAdapter”的適配器和名為“ClubClass”的調用類


在俱樂部類:


ClubAdapter clubAdapter = new ClubAdapter(list, context);

// if you'r calling it from activity then pass "Activity.this" and if fragment then "getContext()" as context.


并在 ClubAdapter

public class ClubAdapter extends RecyclerView.Adapter<ClubAdapter.ClubHolder> {

    private Context context;

    private List<String> list;

   


    public ClubAdapter(List<String> list, Context context) {

        this.list = list;

        this.context = context;

    }

    

    @NonNull

    @Override

    public ClubHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

        View itemView = LayoutInflater.from(viewGroup.getContext())

                .inflate(R.layout.item_sample, viewGroup, false);

        return new ClubHolder(itemView, context);

    }

    

    

    public class ClubHolder extends RecyclerView.ViewHolder {


        private Context context;


        private ClunHolder(@NonNull View itemView,Context context) {

            super(itemView);

            this.context = context;

           

        }

        }

}


或者你可以制作這樣的界面。


public interface RecycleViewOnItemClickListener {

    void onItemClick(int position);

}


并將其從調用類傳遞給您的適配器。


假設我有名為“SampleAdapter”的適配器并調用名為“SampleClass”的類在“SampleClass”中,您可以將適配器中的接口作為參數傳遞。


SampleAdapter sampleAdapter = new SampleAdapter(list, new RecycleViewOnItemClickListener() {

            @Override

            public void onItemClick(int position) {

                // do what you want to perform

            }

        });


在“俱樂部適配器”中


public class ClubAdapter extends RecyclerView.Adapter<ClubAdapter.ClubHolder> {

        private RecycleViewOnItemClickListener recycleViewOnItemClickListener;

        private List<String> list;

       


        public ClubAdapter(List<String> list, RecycleViewOnItemClickListener recycleViewOnItemClickListener) {

            this.list = list;

            this.recycleViewOnItemClickListener = recycleViewOnItemClickListener;

        }

        

        @NonNull

        @Override

        public ClubHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

            View itemView = LayoutInflater.from(viewGroup.getContext())

                    .inflate(R.layout.item_sample, viewGroup, false);

            return new ClubHolder(itemView, recycleViewOnItemClickListener);

        }

        

        

        public class ClubHolder extends RecyclerView.ViewHolder {


            private RecycleViewOnItemClickListener recycleViewOnItemClickListener;


            private ClunHolder(@NonNull View itemView,RecycleViewOnItemClickListener recycleViewOnItemClickListener) {

                super(itemView);

                this.recycleViewOnItemClickListener = recycleViewOnItemClickListener;

               //you can callback onItemClick method from here on button click event so it give callback in "ClubActivity".

               btn.setOnClickListener(new View.OnClickListener() {

                @Override

                public void onClick(View v) {

                    recycleViewOnItemClickListener.onItemClick(getAdapterPosition());

                }

            });

            }

            }

            }


查看完整回答
反對 回復 2022-06-08
?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

要解決此問題,請在方法中移動以下代碼行,onBindViewHolder()如下所示:


holder.btnDetails.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

        Intent i = new Intent(context, ViewSingleClub.class);

        i.putExtra("id", clubId);

        context.startActivity(i);

    }

});

看,我在holder.btnDetails.


編輯:


根據您的意見,還請進行以下操作。將構造函數更改為:


public ClubAdapter1(@NonNull FirestoreRecyclerOptions<Club> options, Context context) {

    super(options);

    this.context = context;

}

當您在活動中創建適配器類的對象時,還將 傳遞context給構造函數。


查看完整回答
反對 回復 2022-06-08
  • 2 回答
  • 0 關注
  • 95 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號