Yury Matatov
Yury Matatov

Reputation: 845

How to use onActivityResult in RecyclerView.Adapter

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

Answers (2)

mohammadReza Abiri
mohammadReza Abiri

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

Kishan Maurya
Kishan Maurya

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

Related Questions