在RecyclerViewAdapter中使用onActivityResult

时间:2018-07-07 13:35:30

标签: java android android-recyclerview onactivityresult

我正在尝试在sap.setVisibleSignature(new Rectangle(425, 218, 575, 248), 1, null);中使用onActivityResult。但是我得到一个错误,即“方法不会从其超类重写”。我尝试实现该接口,但从未调用RecyclerViewAdapter。我已经对StackOverflow问题like this one进行了足够的搜索,但是找不到任何有用的东西。

RecyclerViewAdapter.java

onActivityResult

showImages.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.app.AppCompatActivity;
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
            }
        }
    }

};

}

4 个答案:

答案 0 :(得分:0)

您必须重写onActivityResult,因为其活动中包含的recyclerview不在viewholder类中

答案 1 :(得分:0)

您必须在活动类中而不是RecyclerViewAdapter中实现onActivityResult。您的活动使用此方法从活动开始的其他意图/活动中检索数据 它在RecyclerViewAdapter中没有位置。

答案 2 :(得分:0)

RecyclerView.ViewHolder从来没有要重写的onActivityResult方法。 据我了解,onActivityResult仅出现在activity & fragment中。

移动代码

@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

更新:不是类showImages,应该是开始showImages的类。将代码放在以showImages开始的类上。我注意到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();
        }
    });

答案 3 :(得分:0)

您应该在活动中使用onActivityForResult,并创建用于处理操作的界面,逻辑-适配器仅显示视图。