Ear*_*arl 0 java static android onclick android-recyclerview
我遇到了一个关于将OnItemClickListener设置为我的RecyclerView项目的问题.我尝试按照Android Studio的RecyclerView示例中描述的方式设置监听器.因此,在我的RecyclerView的ViewHolder类中设置了一个监听器.
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);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想调用我的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();
}
Run Code Online (Sandbox Code Playgroud)
但现在问题.当我尝试编译时,它说"非静态方法'openSettings(int)'不能从静态上下文中引用." 我完全不明白这个错误.为什么它是一个静态的上下文?ProgramViewHolder类不会声明为static.
最重要的部分:我该如何解决?我想为RecyclerView的每个项目设置一个OnClickListener,并调用MainActivity的公共方法.
非常感谢你,花时间来帮助我.
这不是ProgramViewHolder是静态的,而是因为尝试从静态上下文调用您的活动(您没有调用活动的特定实例).
您应该做的是将活动传递到recyclerViewAdapter,以便您可以访问它.
例如
MainActivity mainActivity;
public CustomRecyclerViewAdapter(MainActivity mainActivity) {
this.mainActivity = mainActivity;
}
Run Code Online (Sandbox Code Playgroud)
并从MainActivity创建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);
}
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1630 次 |
| 最近记录: |