Reputation: 845
I want to use onActivityResult in RecyclerView.Adapter. But I don't understand how this release in my situation. I have a dynamic RecyclerView.Adapter
RecyclerView.Adapter:
public class SettingsRecyclerAdapter extends RecyclerView.Adapter {
private ArrayList<SettingsTypeModel> dataSet;
Context mContext;
int total_types;
TextInputLayout textInputLayoutIncome;
TextInputLayout textInputLayoutCosts;
EditText editIncome;
EditText editCosts;
public MoneyTypeViewHolder(View itemView) {
super(itemView);
textInputLayoutIncome = (TextInputLayout) itemView.findViewById(R.id.textInputLayoutIncome);
editIncome = (EditText) textInputLayoutIncome.findViewById(R.id.editIncome);
textInputLayoutCosts = (TextInputLayout) itemView.findViewById(R.id.textInputLayoutCosts);
editCosts = (EditText) textInputLayoutCosts.findViewById(R.id.editCosts);
}
}
public static class SendToMailTypeViewHolder extends RecyclerView.ViewHolder {
Switch switchSendMailReport;
public SendToMailTypeViewHolder(View itemView) {
super(itemView);
switchSendMailReport = (Switch) itemView.findViewById(R.id.switchSendMailReport);
}
}
public static class SendToDriveTypeViewHolder extends RecyclerView.ViewHolder {
Switch switchDriveReport;
public SendToDriveTypeViewHolder(View itemView) {
super(itemView);
switchDriveReport = (Switch) itemView.findViewById(R.id.switchDriveReport);
}
}
public SettingsRecyclerAdapter(ArrayList<SettingsTypeModel> data, Context context) {
this.dataSet = data;
this.mContext = context;
total_types = dataSet.size();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
switch (viewType) {
case SettingsTypeModel.TYPE_SEND_TO_MAIL:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.type_send_to_mail, parent, false);
return new SendToMailTypeViewHolder(view);
case SettingsTypeModel.TYPE_SEND_TO_DRIVE:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.type_send_to_drive, parent, false);
return new SendToDriveTypeViewHolder(view);
}
return null;
}
@Override
public int getItemViewType(int position) {
switch (dataSet.get(position).type) {
case 4:
return SettingsTypeModel.TYPE_SEND_TO_MAIL;
case 5:
return SettingsTypeModel.TYPE_SEND_TO_DRIVE;
default:
return -1;
}
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int listPosition) {
SettingsTypeModel object = dataSet.get(listPosition);
if (object != null) {
switch (object.type) {
case SettingsTypeModel.TYPE_SEND_TO_MAIL:
((SendToMailTypeViewHolder) holder).switchSendMailReport.setChecked(false);
((SendToMailTypeViewHolder) holder).switchSendMailReport.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
} else {
}
}
});
// switchSendMailReport.setChecked(getSwitchSendReportMail());
break;
case SettingsTypeModel.TYPE_SEND_TO_DRIVE:
((SendToDriveTypeViewHolder) holder).switchDriveReport.setChecked(false);
((SendToDriveTypeViewHolder) holder).switchDriveReport.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
((SendToDriveTypeViewHolder) holder).switchDriveReport.setChecked(false);
} else {
}
}
});
break;
}
}
}
@Override
public int getItemCount() {
return dataSet.size();
}
}
Activity:
public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_settings);
ArrayList<SettingsTypeModel> list= new ArrayList<>();
list.add(new SettingsTypeModel(SettingsTypeModel.TYPE_SEND_TO_MAIL));
list.add(new SettingsTypeModel(SettingsTypeModel.TYPE_SEND_TO_DRIVE));
SettingsRecyclerAdapter adapter = new SettingsRecyclerAdapter(list,this);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, OrientationHelper.VERTICAL, false);
RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recyclerVieww);
mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
mRecyclerView.setLayoutManager(linearLayoutManager);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
mRecyclerView.setClickable(true);
mRecyclerView.setAdapter(adapter);
}
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
public void onBackPressed() {
super.onBackPressed();
}
}
After clicking to switchSendMailReport or switchDriveReport I need to call a function onActivityResult.
How to use onActivityResult in RecyclerView.Adapter?
Thanks a lot!
Upvotes: 3
Views: 493
Reputation: 1799
create an interface
in your SettingsRecyclerAdapter
:
public interface OnAdapterResult {
public void onAdapterResult(boolean isChecked);
}
and Attach the interface in it's constructor :
public SettingsRecyclerAdapter (Context context){
mContext = context;
// .. Attach the interface
try{
onAdapterResult = (OnAdapterResult) context;
}catch(ClassCastException ex){
Log.e("MyAdapter","error"+ ex,);
}
}
then init your interface method :
((SendToMailTypeViewHolder) holder).switchSendMailReport.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if (isChecked) {
onAdapterResult.onAdapterResult(isChecked); \\ here
} else {
}
}
});
then implements
Your SettingsActivity
from adepter.OnAdapterResult
interface
:
public class SettingsActivity extends AppCompatActivity implements adepter.OnAdapterResult {
.
.
.
@Override
public void onAdapterResult(boolean isChecked) {
//
}
}
Upvotes: 3
Reputation: 3394
You can't use activity's onActivityResult() inside your adapter class. but you can create your own same method in the adapter class
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
// do you stuff
}
Now from activity when you get call back in onActivityResult() call your adapter method
if(adapter !=null){
adapter.onActivityResult(requestCode,resultCode,data)
}
Upvotes: 2