在适配器中可以有方法startActivtyForResult
吗?那么如何获得响应呢?在哪里执行回调函数?
发布于 2013-11-16 15:32:47
是的,这是可能的。您需要在适配器中引用Context
并调用该活动:
Intent intent = new Intent(context, TargetActivity.class);
((Activity) context).startActivityForResult(intent, REQUEST_FOR_ACTIVITY_CODE);
请注意,上下文必须是活动上下文,否则此代码将失败。
您可以像往常一样使用onActivityResult
在封闭的活动中获得结果。
所以,举个例子:
在您的适配器中:
MyAdapter(Context context) {
mContext = context;
}
public View getView(int position, View convertView, ViewGroup parent) {
…
open.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
…
Activity origin = (Activity)mContext;
origin.startActivityForResult(new Intent(mContext, SecondActivity.class), requestCode);
}
});
…
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("MyAdapter", "onActivityResult");
}
在第二个练习中,像往常一样使用setResult
和finish
。
在主活动中,捕获结果并将其传递给适配器回调:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
mAdapter.onActivityResult(requestCode, resultCode, data);
}
发布于 2017-02-17 19:23:40
Yes.You可以从适配器调用startactivityforresult()。
有两种情况-1.从activity调用适配器和在activity中需要onActivityResult。2.从片段中调用适配器,需要片段中的onActivityResult。
案例1:在Activity中获取OnActivityResult,然后将activity的引用传递给适配器构造函数
public MyAdapter(Activity pActivity, List<MyBean> pList) {
mList = pList;
mActivity = pActivity;
}
现在是startActivityForResult
Intent intent = new Intent(context, TargetActivity.class);
mActivity.startActivityForResult(intent, REQUEST_FOR_ACTIVITY_CODE);
案例2:在片段中获取OnActivityResult,然后将片段的引用传递给适配器构造函数
public MyGamesAdapter(Fragment pContext, List<MyBean> pList,) {
mList = pList;
mMyFragment =pContext;
}
Intent intent = new Intent(context, TargetActivity.class);
mMyFragment.startActivityForResult(intent, REQUEST_FOR_ACTIVITY_CODE);
现在,在activity或fragment中重写OnActivityResult并获取结果。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
mAdapter.onActivityResult(requestCode, resultCode, data);
}
发布于 2020-10-03 15:45:50
我使用了一种更简单的方法。在您的activity/fragment中创建一个公共函数,它将调用activity以获取结果
public void startActivityFromAdapter(String Arguments){
//todo: add steps you would like to compute
startActivityForResult(Intent, REQ_CODE);
}
在创建适配器时,将当前活动/片段作为参数传递。我将以activity为例
public MyAdaper(Activity activity, ArrayList<String> list){
this.activity = activity;
this.list = list;
}
通过将活动强制转换为activity类,从viewholder调用公共函数
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.applyBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
((ActivityName) activity).startActivityFromAdapter(list.get(position).code);
}
});
}
并在您的调用活动/片段中使用onActivityResult
编辑:
我不推荐使用上面的方法,因为它限制适配器只能在一个活动中使用。更好的做法是,您必须使用一个接口来实现相同的功能
创建接口和onClickFunction
public interface AdapterInteface{
void onBtClick(int Position)
}
现在,当您创建适配器时,接受此接口作为参数,并在单击按钮时调用函数
public MyAdaper(Activity activity, ArrayList<String> list, AdapterInterface adapterInterface){
this.activity = activity;
this.list = list;
this.adapterInterface = adapterInterface
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.applyBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
adapterInterface.onBtClicked(position)
}
});
}
在您的活动/片段上实现此接口,并将活动/片段上的函数onBtClicked重写为startActivityForResult
https://stackoverflow.com/questions/20015950
复制相似问题