简体   繁体   中英

How to handle interface for onActivityResult Override Method

I want to use onActivityResult method in Adapter but after searching on Stack Overflow I found I have to make interface for onActivityResult but I donot know how to make this and handle onActivityResult Methode to work as per my need.

Here is my Adapter Class.

    public class PosterAdapter extends RecyclerView.Adapter<PosterAdapter.PosterViewHolder> {


    private static final String TAG = "resPoster";
    private ArrayList<Poster> posterArrayList;
    private Context context;



    public PosterAdapter(ArrayList<Poster> posterArrayList, Context context) {
        this.posterArrayList = posterArrayList;
        this.context = context;
    }

    @NonNull
    @Override
    public PosterViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View itemView = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.sending_image_layout, viewGroup, false);

        return new PosterViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull PosterViewHolder posterViewHolder, int i) {

        posterViewHolder.imageViewDownload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                posterViewHolder.relativeLayoutImage.setDrawingCacheEnabled(true);

                Bitmap bitmap = Bitmap.createBitmap(posterViewHolder.relativeLayoutImage.getDrawingCache());
                posterViewHolder.relativeLayoutImage.setDrawingCacheEnabled(false);


                FileOutputStream outStream = null;
                File sdCard = Environment.getExternalStorageDirectory();
                File dir = new File(sdCard.getAbsolutePath() + "/providers");
                dir.mkdirs();
                String fileName = String.format("%d.jpg", System.currentTimeMillis());
                Log.d(TAG,"filename: " +  fileName);
                File outFile = new File(dir, fileName);
                Log.d(TAG,"outFile: " +  outFile);
                try {
                    outStream = new FileOutputStream(outFile);
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
                    outStream.flush();
                    outStream.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        });

        posterViewHolder.imageViewEdit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent();
                i.setType("image/*");
                i.setAction(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
//                startActivityForResult(i, 0);
                ((Activity) context).startActivityForResult(Intent.createChooser(i, "CHOOSING INTENT"), 0);
            }
        });



    }





    @Override
    public int getItemCount() {
        return posterArrayList.size();
    }

    public class PosterViewHolder extends RecyclerView.ViewHolder {

        RelativeLayout relativeLayoutImage;
        ImageView imageViewBg, imageViewEdit, imageViewDownload, imageViewShare;
        CircleImageView imageViewProfie;

        public PosterViewHolder(@NonNull View posterView) {
            super(posterView);

            relativeLayoutImage = posterView.findViewById(R.id.image_relative);
            imageViewBg = posterView.findViewById(R.id.image_bg);
            imageViewProfie = posterView.findViewById(R.id.image_profile_moving);
            imageViewEdit = posterView.findViewById(R.id.edit_image);
            imageViewDownload = posterView.findViewById(R.id.download_image);
            imageViewShare = posterView.findViewById(R.id.share_image);

        }
    }

}

and I want to use this class

 @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (resultCode == RESULT_OK) {
        if (requestCode == 0) {
            final Uri selectedUri = data.getData();
            if (selectedUri != null) {
                startCrop(selectedUri);
            } else {
                Toast.makeText(context, "Cannot retrieve selected Image", Toast.LENGTH_SHORT).show();
            }
        } else if (requestCode == UCrop.REQUEST_CROP) {
            handleCropResult(data);
        }
    }
    if (resultCode == UCrop.RESULT_ERROR) {
        handleCropError(data);
    }
}

Please Help me handle this method in interface. Thank you.

**UPDATE: **

Here is my activity code to understand more my question.

     RequestQueue requestQueue;
    private ArrayList<Poster> posterArrayList = new ArrayList<>();
    private RecyclerView recyclerView;
    private PosterAdapter posterAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sending_image);

        requestQueue = Volley.newRequestQueue(this);

        recyclerView = findViewById(R.id.recycler_poster);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));


        getAllPoster();
    }

    private void getAllPoster() {
        HashMap<String, String> params = new HashMap<String, String>();
        params.put("poster_id", "1");

        Log.d(TAG + "pp", String.valueOf(params));




        String Url = Constants.Base_URL + "poster/";

        JsonObjectRequest request = new JsonObjectRequest(Url,  new JSONObject(params),
                response -> {
                    Log.d("responsePending", String.valueOf(response));

                    try {
                        String statusResponseObject = response.getString("status");
                        String msgObject = response.getString("msg");

                        if (statusResponseObject.equals("200")){

                            JSONArray jsonArray = response.getJSONArray("response");

                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject pendingFragResponse = jsonArray.getJSONObject(i);

                                String posterObject = pendingFragResponse.getString("poster");
                                String positionObject = pendingFragResponse.getString("position");
                                String sizeObject = pendingFragResponse.getString("size");
                                String txt_positionObject = pendingFragResponse.getString("txt_position");
                                String titleObject = pendingFragResponse.getString("title");
                                String descriptionObject = pendingFragResponse.getString("description");


                                //

                                posterArrayList.add(new Poster(posterObject, positionObject,
                                        sizeObject, txt_positionObject,
                                        titleObject, descriptionObject));
                                posterAdapter = new PosterAdapter( posterArrayList, SendingImageActivity.this);
                                recyclerView.setAdapter(posterAdapter);
//                                wp10ProgressBar.hideProgressBar();
//                                wp10ProgressBar.setVisibility(View.GONE);

                            }
                            posterAdapter.notifyDataSetChanged();
//                            wp10ProgressBar.hideProgressBar();
                        }else {
//                            wp10ProgressBar.hideProgressBar();
//                            wp10ProgressBar.setVisibility(View.GONE);
                            Toast.makeText(SendingImageActivity.this, msgObject, Toast.LENGTH_SHORT).show();
                        }

                    } catch (JSONException e) {
                        e.printStackTrace();
                        Toast.makeText(this, "Server didn't response, Try after some time", Toast.LENGTH_LONG).show();
                    }



                }, error -> {
            error.printStackTrace();
            Log.d(TAG + "error", String.valueOf(error.getMessage()));
            Toast.makeText(this, "Server didn't response, Try after some time", Toast.LENGTH_LONG).show();

        });

        requestQueue.add(request);
    }




}


                    } catch (JSONException e) {
                        e.printStackTrace();
                        Toast.makeText(this, "Server didn't response, Try after some time", Toast.LENGTH_LONG).show();
                    }



                }, error -> {
            error.printStackTrace();
            Log.d(TAG + "error", String.valueOf(error.getMessage()));
            Toast.makeText(this, "Server didn't response, Try after some time", Toast.LENGTH_LONG).show();

        });

        requestQueue.add(request);
    }




}

Rather than using Interface pattern just create public method inside your adapter and call that method when your onActivityResult hits in Activity .

(This answer is just a workaround for your scenario. Ideally you should not pass your activity Context to your adapter, rather than use Interface pattern and receive callback inside your activity whenever any action took place (like clicking on edit button) inside your activity and pass relevant data while trigger callback from your adapter.)

You can refer AllNoteActivity and NoteAdapter for reference here

So what you need to do is put the current method onActivityResult() from PosterAdapter to the activity. Then make the methods startCrop(), handleCropResult() and handleCropError() public (I assume are in PosterAdapter).

In the onActivityResult() change the call of startCrop() to posterAdapter.startCrop(). Same for the other methods. And that should do it.

Create a method in adapter

In your adapter class

    public void waterverYouWantMethod(){

}

And call that method from Activity when onActivityResult mehtod called.

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (resultCode == RESULT_OK) {
   // call that method here
adapter.wateverYouWantMethod();


    }

    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM