在 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,并创建接口来处理操作、逻辑 - 适配器仅显示视图。
我正在尝试在 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,并创建接口来处理操作、逻辑 - 适配器仅显示视图。