use*_*687 112 android list adapter addressing
是否可以调用Activity
from中定义的方法ListAdapter
?
(我想打一个Button
在list's
行单击此按钮时,它应该执行的方法,即在相应的活动定义.我试图设置onClickListener
在我ListAdapter
,但我不知道该怎么称呼这种方法,什么是它的路径. ..)
当我使用时,Activity.this.method()
我收到以下错误:
No enclosing instance of the type Activity is accessible in scope
Run Code Online (Sandbox Code Playgroud)
任何的想法 ?
Eld*_*abu 289
是的你可以.
在适配器中添加一个新字段:
private Context mContext;
Run Code Online (Sandbox Code Playgroud)
在适配器构造函数中添加以下代码:
public AdapterName(......, Context context) {
//your code.
this.mContext = context;
}
Run Code Online (Sandbox Code Playgroud)
在适配器的getView(...)中:
Button btn = (Button) convertView.findViewById(yourButtonId);
btn.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
if (mContext instanceof YourActivityName) {
((YourActivityName)mContext).yourDesiredMethod();
}
}
});
Run Code Online (Sandbox Code Playgroud)
替换为您自己的类名,您可以在其中查看代码,活动等.
如果您需要将同一个适配器用于多个活动,那么:
创建一个接口
public interface IMethodCaller {
void yourDesiredMethod();
}
Run Code Online (Sandbox Code Playgroud)
在此方法调用功能所需的活动中实现此接口.
然后在Adapter getView()中,调用如下:
Button btn = (Button) convertView.findViewById(yourButtonId);
btn.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
if (mContext instanceof IMethodCaller) {
((IMethodCaller) mContext).yourDesiredMethod();
}
}
});
Run Code Online (Sandbox Code Playgroud)
你完成了.如果您需要将此适配器用于不需要此调用机制的活动,则代码将不会执行(如果检查失败).
Igo*_*pov 118
你可以这样做:
声明接口:
public interface MyInterface{
public void foo();
}
Run Code Online (Sandbox Code Playgroud)
让你的活动改变它:
public class MyActivity extends Activity implements MyInterface{
public void foo(){
//do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
然后将您的活动传递给ListAdater:
public MyAdapter extends BaseAdater{
private MyInterface listener;
public MyAdapter(MyInterface listener){
this.listener = listener;
}
}
Run Code Online (Sandbox Code Playgroud)
在适配器的某个地方,当你需要调用那个Activity方法时:
listener.foo();
Run Code Online (Sandbox Code Playgroud)
Jar*_*ows 60
我理解当前的答案,但需要一个更清晰的例子.这是我使用Adapter
(RecyclerView.Adapter)和一个例子Activity
.
这将实现interface
我们所拥有的Adapter
.在此示例中,将在用户单击中的项目时调用它RecyclerView
.
public class MyActivity extends Activity implements AdapterCallback {
private MyAdapter myAdapter;
@Override
public void onMethodCallback() {
// do something
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myAdapter = new MyAdapter(this);
}
}
Run Code Online (Sandbox Code Playgroud)
在Activity
,我们启动了我们Adapter
并将其作为构造函数的参数传递.这将启动我们interface
的回调方法.您可以看到我们使用回调方法进行用户点击.
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private AdapterCallback adapterCallback;
public MyAdapter(Context context) {
try {
adapterCallback = ((AdapterCallback) context);
} catch (ClassCastException e) {
throw new ClassCastException("Activity must implement AdapterCallback.", e);
}
}
@Override
public void onBindViewHolder(MyAdapter.ViewHolder viewHolder, int position) {
// simple example, call interface here
// not complete
viewHolder.itemView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
try {
adapterCallback.onMethodCallback();
} catch (ClassCastException e) {
// do something
}
}
});
}
public static interface AdapterCallback {
void onMethodCallback();
}
}
Run Code Online (Sandbox Code Playgroud)
Ck *_*rya 12
基本而简单.
在你的适配器中使用它.
((YourParentClass)context).functionToRun();
还有一种方法是::
在你的适配器中写一个方法让我们说public void callBack(){}.
现在,为活动中的适配器创建对象时,会覆盖此方法.在适配器中调用方法时,将调用覆盖方法.
Myadapter adapter = new Myadapter() {
@Override
public void callBack() {
// dosomething
}
};
Run Code Online (Sandbox Code Playgroud)
对于科特林:
在您的适配器中,只需调用
(context as Your_Activity_Name).yourMethod()
Run Code Online (Sandbox Code Playgroud)