[英]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.