在 RecyclerView Adapter 中使用 onActivityResult

Use onActivityResult in RecyclerViewAdapter

我正在尝试在 RecyclerViewAdapter 中使用 onActivityResult。但是我得到 'The method does not override from its superclass' 的错误。我尝试实现接口,但 onActivityResult 从未被调用。我已经对 Whosebug 问题进行了充分的搜索 like this one,但找不到任何有用的信息。

RecyclerViewAdapter.java

package com.example.waheed.telegramchat;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.List;

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.RecyclerViewHolder> {
    //String arrays to store user data
    static String[] contact_name, Phone_no, user_id;
    Context context;

    public RecyclerAdapter(String[] contact_name, String[] Phone_no, String[] user_id, Context context) {

        //Getting the data from MainActivity.java
        this.context = context;
        this.user_id = user_id;
        this.contact_name = contact_name;
        this.Phone_no = Phone_no;
    }

    @NonNull
    @Override
    public RecyclerAdapter.RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        //Setting the row layout for Recyclerview
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_layout, parent, false);
        RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(view, this.context);

        return recyclerViewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerViewHolder holder, int position) {


        holder.tx_contact.setText(contact_name[position]);
        holder.tx_phone.setText(Phone_no[position]);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }

    @Override
    public int getItemCount() {
        return contact_name.length;

    }

    public static class RecyclerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {


        Context context;
        TextView tx_contact, tx_phone;
        ImageButton message_btn;
        static ImageView img_profile;

        public RecyclerViewHolder(View itemView, Context context) {
            super(itemView);
            tx_contact = (TextView) itemView.findViewById(R.id.txt_contactname);
            tx_phone = (TextView) itemView.findViewById(R.id.phonenumber);
            message_btn = (ImageButton) itemView.findViewById(R.id.chat_icon);
            img_profile = (ImageView) itemView.findViewById(R.id.profile_pic);
            this.context = context;
            //Calling onclick function
            message_btn.setOnClickListener(this);
            img_profile.setOnClickListener(this);

        }

        public void makeCall(String ID, String name, String packageName, String className) {

            //
            String data = "content://com.android.contacts/data/" + ID;
            // Build the intent
            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_VIEW);
            // the _ids you save goes here at the end of /data/id
            intent.setData(Uri.parse("content://com.android.contacts/data/" + ID));
            intent.setDataAndType(Uri.parse(data), className);
            intent.setPackage(packageName);
            // Verify it resolves
            PackageManager packageManager = context.getPackageManager();
            List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
            boolean isIntentSafe = activities.size() > 0;
            Log.d("See this " + ID, activities.size() + "");
            // Start an activity if it's safe
            if (isIntentSafe) {
                try {
                    //Toast to show which user is being called
                    context.startActivity(intent);
                    Toast.makeText(context, "Opening chat with " + name + " on Telegram", Toast.LENGTH_SHORT).show();
                } catch (Exception e) {
                    Toast.makeText(context, "OOPS!,Something went wrong\nPlease grant app permissions in setting or send feedback.", Toast.LENGTH_LONG).show();
                }
            }

        }

        @Override
        public void onClick(View v) {

            //Getting the position of the item clicked
            int i = getAdapterPosition();
            //Storing the selected items in Strings
            String name = RecyclerAdapter.contact_name[i];
            String phone = RecyclerAdapter.Phone_no[i];
            String ID = RecyclerAdapter.user_id[i];
            String mimeType = "vnd.android.cursor.item/vnd.org.telegram.messenger.android.profile";


            String packageName = "org.telegram.messenger";

            switch (v.getId()) {
                case R.id.chat_icon:
                    makeCall(ID, name, packageName, mimeType);
                    break;
                case R.id.profile_pic:
                    Intent intent = new Intent(this.context, showImages.class);
                    ((Activity) context).startActivityForResult(intent, 1);
                    break;

            }
        }

        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            Bitmap bitmap;
            if (requestCode == 1) {
                if (resultCode == showImages.RESULT_OK) {
                    String result = data.getStringExtra("result");
                    Toast.makeText(this.context, "Clicked item is " + result, Toast.LENGTH_SHORT).show();
                    bitmap = BitmapFactory.decodeFile(result);
                    RecyclerViewHolder.img_profile.setImageBitmap(bitmap);
                }
                if (resultCode == showImages.RESULT_CANCELED) {
                    //Write your code if there's no result
                }
            }
        }

    }
}

showImages.java

package com.example.waheed.telegramchat;

import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;

import com.ImageAdapter;

import java.io.File;
import java.util.ArrayList;

public class showImages extends AppCompatActivity {

    ImageAdapter myImageAdapter;
    GridView gridView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show_images);
        gridView = (GridView) findViewById(R.id.gridview);
        myImageAdapter = new ImageAdapter(this);
        gridView.setAdapter(myImageAdapter);

        String ExternalStorageDirectoryPath = Environment
                .getExternalStorageDirectory()
                .getAbsolutePath();

        String targetPath = ExternalStorageDirectoryPath + "/Android/data/org.telegram.messenger/cache/";

        File targetDirector = new File(targetPath);

        final ArrayList<String> imagePaths = new ArrayList<String>();
        final File[] files = targetDirector.listFiles();
        for (File file : files) {
            if (file.getName().toLowerCase().endsWith(".jpg") ||
                    file.getName().toLowerCase().endsWith(".png")) {
                imagePaths.add(file.getAbsolutePath());
                myImageAdapter.add(file.getAbsolutePath());
            }
        }

        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String result = imagePaths.get(position);
                Intent returnIntent = new Intent();
                returnIntent.putExtra("result", result);
                setResult(showImages.RESULT_OK, returnIntent);
                finish();
            }
        });
    }
}

您必须覆盖 activity 中的 onActivityResult,它包含不在 viewholder 中的 recyclerview class

您必须在 activity class 而不是 RecyclerViewAdapter 中实施 onActivityResult。您的 activity 使用此方法从其他 intents/activities 检索数据,这些数据从您的 activity 开始并且通常 它在 RecyclerViewAdapter 中没有位置。

RecyclerView.ViewHolder class 不包含它可以覆盖的 onActivityResult 方法的定义。

onActivityResult,据我了解,仅作为 Activity & Fragment classes 的一种方法出现。

移码

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Bitmap bitmap;
    if (requestCode == 1) {
        if (resultCode == showImages.RESULT_OK) {
            String result = data.getStringExtra("result");
            Toast.makeText(this.context, "Clicked item is " + result, Toast.LENGTH_SHORT).show();
            bitmap = BitmapFactory.decodeFile(result);
            RecyclerViewHolder.img_profile.setImageBitmap(bitmap);
        }
        if (resultCode == showImages.RESULT_CANCELED) {
            //Write your code if there's no result
        }
    }
}

发送给发起对 showImages 的调用的 class。我注意到单击项目时 showImages 关闭。

gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        String result = imagePaths.get(position);
        Intent returnIntent = new Intent();
        returnIntent.putExtra("result", result);
        setResult(showImages.RESULT_OK, returnIntent);
        finish();
    }
});

您应该在 activity 中使用 onActivityForResult,并创建接口来处理操作、逻辑 - 适配器仅显示视图。