簡體   English   中英

RecyclerView Onclick(調用非靜態方法)

[英]RecyclerView Onclick (call non-static method)

我遇到了有關將OnItemClickListener設置到RecyclerView項目的問題。 我試圖按照Android Studio的RecyclerView示例中所述的方式設置偵聽器。 因此,在ViewHolder類中為我的RecyclerView設置了一個偵聽器。

public class ProgramViewHolder extends RecyclerView.ViewHolder {
    protected TextView vName;
    protected ImageView vProgramImage;

    public ProgramViewHolder(View v) {
        super(v);
        vName = (TextView) v.findViewById(R.id.programName);
        vProgramImage = (ImageView) v.findViewById(R.id.programImage);

        v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // HERE PROBLEM !! 
                MainActivity.openSettings(1);
            }
        });
    }
}

現在,我想調用MainActivity openSettings(int)的方法來加載片段:

public void openSettings(int layoutId) {
    settingsFragment setFrag = new settingsFragment();

    Bundle information = new Bundle();
    information.putInt("layoutId", layoutId);

    setFrag.setArguments(information);
    getFragmentManager().beginTransaction()
            .replace(R.id.fragmentContainer, setFrag)
            .commit();
}

但是現在有問題了。 當我嘗試編譯時,它說:“不能從靜態上下文中引用非靜態方法'openSettings(int)'”。 我完全不明白這個錯誤。 為什么是靜態上下文? 類ProgramViewHolder尚未聲明為靜態。

最重要的部分:如何解決? 我想為RecyclerView的每個項目設置一個OnClickListener並調用MainActivity的公共方法。

非常感謝您花時間幫助我。

並不是說ProgramViewHolder是靜態的,那是因為嘗試從靜態上下文中調用您的活動(您不是在調用活動的特定實例)。

您應該做的是將活動傳遞到recyclerViewAdapter中,以便您可以訪問它。

例如

MainActivity mainActivity;
public CustomRecyclerViewAdapter(MainActivity mainActivity) {
    this.mainActivity = mainActivity;
}

並從MainActivity創建RecyclerViewAdapter, CustomRecyclerView recyclerViewAdapter = new CustomRecyclerViewAdapter(this); recyclerViewAdapter.setAdapter(recyclerViewAdapter); CustomRecyclerView recyclerViewAdapter = new CustomRecyclerViewAdapter(this); recyclerViewAdapter.setAdapter(recyclerViewAdapter);

然后,您應該能夠訪問您的方法,例如mainActivity.openSettings(1);

讓我知道你是否有任何麻煩

//編輯

這是從bindViewHolder設置onClick的方法。 由於RecyclerView“回收”數據的方式,您想在此處設置任何onClickListeners。 例如,如果每一行應在點擊時執行不同的操作,則需要確保點擊偵聽器綁定到特定行。 在onBindViewHolder中創建它可以確保這一點。 如果要單擊整個行而不是單擊其中的元素,則只需創建一個填充整個行的外部視圖即可。 然后將onClickListener與此綁定。

// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    // - get element from your dataset at this position
    // - replace the contents of the view with that element

    ProgramViewHolder programViewHolder = (ProgramViewHolder) holder;
    programViewHolder.vName.setOnClicklistener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mainActivity.openSettings(1);
        }
    });

}

如果您具有包含recyclerView的活動的context ,則只需執行以下操作:

your_view_holder.v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // HERE SOLUTION!! 
                ((MainActivity)context).openSettings(1);
            }
        });

您可以將其放在onBindViewHolder(...)

如何獲得上下文:

在Adapter的構造函數中創建上下文的另一個參數,並在實例化Adapter之后通過活動傳遞上下文。

為什么要傳遞上下文:

我建議您始終傳遞上下文並將其分配給任何適配器的變量,因為這是您在使用適配器時不時需要的內容,因此不必每次都使用替代方法來保存上下文,只需保存一次即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM