【问题标题】:Use onActivityResult in RecyclerViewAdapter在 RecyclerView 适配器中使用 onActivityResult
【发布时间】:2019-07-08 14:59:36
【问题描述】:

我正在尝试在我的RecyclerViewAdapter 中使用onActivityResult。但是我得到了“方法没有从它的超类覆盖”的错误。我尝试实现接口,但 onActivityResult 永远不会被调用。我已经在 StackOverflow 问题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();
            }
        });
    }
}

【问题讨论】:

  • ImageAdapter 类中创建一个公共方法并使用myImageAdapter 对象传递数据。
  • showImages Activity 中写入onActivityResult 覆盖方法,内部结果可以使用myImageAdapter.onActivityResult(requestCode, resultCode, data) 将数据传递给适配器,其余的都很好。

标签: java android android-recyclerview onactivityresult


【解决方案1】:

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 在单击项目时关闭。

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();
    }
});

【讨论】:

  • RecyclerViewHolder.img_profile.setImageBitmap(bitmap); 这个暂时不保证存在
  • @EpicPandaForce 你能详细说明一下吗?这和OP问题有关系吗?
  • 我的意思是,如果您从另一个应用程序返回并且您的应用程序因内存不足而被杀死。你得到了意图,但你可能还没有加载你的异步数据,所以适配器不会有这个视图,所以可能会崩溃
  • 我第三次看代码,没有真正注意那部分。当从showImages 返回时,recyclerView 的适配器应该根据位置更新项目,将图像路径传入。让 onBindViewHolder() 函数在那里更新图像。 RecyclerView 将在应用程序进入后台和返回前台时保存和恢复,视图将保持不变,因此无需担心这部分。 OP 还应该上传布局文件,因为他/她对 imageView 使用静态变量,这让我很困惑。
【解决方案2】:

您必须在您的活动中覆盖 onActivityResult,其中包含不在 viewholder 类中的 recyclerview

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      你应该在活动中使用onActivityForResult,并创建接口来处理动作,逻辑-适配器只显示视图。

      【讨论】:

        猜你喜欢
        • 2021-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多